安裝 PayPal SDK,您還需要一些擴展功能: PEAR、cURL 和 SSL。 盡管它們可以在
php.ini 中加載,但使用 PHP 編譯可得到最佳結果。
充分設置好環境后,您需要下載 PayPal PHP SDK,其中包括服務/ PayPal PEAR 程序包、 PayPal Web 控制臺、SDK 文檔和 PDF 信息文檔。 (參見下方“無法使用 Web 控制臺”部分中關于 Web 控制臺的重要注意事項。) 在下載和提取此文件后,您需要運行一些命令行操作:
pear install --alldeps /Services_PayPal/package.xml
cp -r /WebConsole
此命令可以安裝一些其它的 PEAR 程序包,為您提供一個功能完善的 PayPal SDK。 在瀏覽器中訪問 http://localhost/WebConsole 頁面后, PayPal 配置文件管理工具將顯示一條問候消息,您可以在此處檢查 PayPal SDK 的有效性。 常見問題包括丟失 cURL 或 SSL 的安裝,通過修改 php.ini 或重新編譯 PHP,然后再次運行 PEAR 命令,這些問題將得到修復。 如果因為托管限制或安全性問題而無法安裝 PEAR 或某種必要的擴展功能,您還可以使用下方描述的標準結帳。
采用穩妥的方式……
通過 SDK 使用 API 是使用 PayPal 功能的一種靈活、有效的方式。 API 支持的兩種支付方式包括:
直接付款:使用此方式可以收集網站上的詳細帳單,從用戶的信用卡收費,全 部工作在自己網站上完成。 這種方法適合擁有 https 安全應用程序和基礎架構(用于存儲客戶和購物車信息)的大型機構。
快速結帳:這種方式允許用戶使用 PayPal 帳戶信息和選擇發貨方式,不需要在網站上重新輸入信息,從而節省了時間。同時, 這種方式不需要應用程序存儲購買者信息的本地副本,管理此方式時只需要最少的額外安全性基礎架構。
其它 API 特性(文中并未完全涉及)包括:
慈善捐款:根據用戶的購物情況,提供有關 慈善捐款的實時信息。
發貨:如果 銷售的是現實產品,則允許用戶選擇發貨商、發貨方式、保險和其它屬性。 在用戶確實購買貨物之前,您就可以向用戶提供發貨的成本,或者也可以使用此特性在產品顯示頁面提供更準確的價格。
退款:提供向用戶退款的方法。
稅款:根據每件貨物或每個購物車收稅,并適當地將稅款顯示在收據和發票 上。
訂閱: 靈活地定義現實貨物和數字貨物的循環訂閱。
SDK 還提供了廣泛的 eBay 支持,盡管其價值不在我們討論的范圍內。
……或者采用簡易方式
如果 SDK 的功能遠遠超出用戶的需求,在此情況下,PayPal 提供了另一種解決方案。 標準結帳不使用 SOAP,只依賴于在應用程序與 PayPal 安全服務器間傳遞 HTML 表單值。 要使用標準結帳,您只需要生成一個表單,該表單可以提交適當的 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>
提交表單后,用戶將進入 PayPal 的服務器,輸入帳單信息。 在完成信息驗證和帳單授權機制后,用戶將返回您在網站上定義的一個位置。 如果您僅僅是收集捐款,而不是銷售物品,那么您的工作已經完成了! 然而,對于其它情況,用戶可使用大量的變量來定制功能、貨幣和顯示方面的體驗。 (參見參考指南。)
使用帶有 notify_url 變量的即時付款通知 (IPN) 時,一旦用戶在指定的地點完成付款,您的應用程序就會得到通知 — 您可以使用定制的鏈接提供專用用戶標識,例如,允許對在線內容進行即時訪問或觸發一個批發商的訂單。 另外,通過使用發票和定制變量,您可以創建一個機構,將 PayPal 的記錄限制在您自己的域中。 如果應用程序已經保存了用戶名和地址信息,您可以通過一組變量(包括 address1 、city 和 country)將這些信息傳遞給 PayPal ,以便預先填充相應的字段。
標準結帳的基本方式 中也包含 API 為收集非盈利性資金而提供的許多特性, 例如,可以應用到每個購物車或每件貨物的稅款、處理和發貨變量。
cpp_ 系列變量(包括 cpp_header_image、cpp_headerback_color、cpp_headerborder_color 和 cs)允許您精確調整用戶在 PayPal 服務器上的體驗,這些變量用于設置支付頁面的背景顏色。 如果這種方法能夠滿足應用程序的需求,標準結帳將是一種非常經濟有效的解決方案。 與基于 API 的直接付款方式不同,標準結帳并不確定每月的費用,并且實施期間的開發工作非常少。
準備付款
要使用 PayPal API,首先要熟悉開發人員中心。 您將在開發人員中心建立帳戶,以便在 Sandbox 中創建買方與賣方的示例帳戶。 示例帳戶創建完畢后,使用該帳戶登錄到 Sandbox 將顯示擁有資金的有效 PayPal 帳戶。 您的買方可以從其他 Sandbox 帳戶購買物品,您的賣方可以將貨款退還給其他 Sandbox 帳戶,這些都不需要現金轉移,也不需要收費代理。 PayPal 的集成中心提供了極好的逐步指南(注意,第 3 步是我在前面介紹的安裝過程),我將在此處提供該指南的概述。
首先,您需要在 developer.paypal.com 注冊一個帳戶,此網頁是訪問各種開發人員資源的中心點,用于創建 Sandbox 帳戶。 之后,您將在 developer.paypal.com 的 Sandbox 選項卡中創建一個買方示例和一個賣方示例。這項工作非常簡單,為了使創建的內容有意義,您只需要足夠的創造力。 例如,在提示您輸入銀行帳戶信息時,為了方便使用,建議您將系統提供的虛擬帳戶號作為銀行的名稱。 另外,您可以為買方帳戶和賣方帳戶使用相同的密碼,因為此服務器發生密碼泄露的風險很低。 在 Sandbox 中學習的特性與生產時使用的特性完全相同,從而減少了培訓和測試時間。
在 Sandbox 中最后一個重要的步驟是創建測試證書,這是一個小型文本文件,其中包含將與每個 API 調用一起使用的密鑰。 要創建一個證書,您需要登錄到賣方 Sandbox 帳戶,單擊 Profile,然后依次選擇 API Access 和 View or Remove Credentials。 記錄此文件和密碼;您將在配置應用程序時用到它們。
回到 developer.paypal.com,您可以查看測試證書的信息,也可以從 Test Certificates 選項卡下載測試證書。 此處不能查看 API 密碼;要獲得此信息,您必須重新登錄到 http://www.sandbox.paypal.com,然后訪問上述位置。
直接付款處理
與 PayPal 交互的最靈活的方式是通過 SDK 來完成,SDK 會將基于 SOAP 的請求抽象成可管理的信息。 不同調用要完成的目標不同,但執行的步驟基本相同: 認證、操作和響應流程。 第一個步驟,認證,來自 SDK 示例,同樣需要用在下方的快速結帳方法中。 顯示的值用于 Sandbox 測試: 需要為生產創建帶有認證詳細信息的新證書。
$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);
認證完成后,應用程序已經準備好處理 API 請求。 在直接付款時,您的應用程序必須有能力、有責任創建和存儲訂單的狀態,并為訂單創建收據: 在下一個示例中,我們將假定應用程序已將所有相關信息存儲到以下表格中: Customer、Billing_Method、Order 和 Line_item。 本示例使用 PHP 數據對象 (PDO),在此情況下,傳統的 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);
此時, PayPal 執行請求的直接付款。 為了解發生的情況,現在,應用程序會獲取第三步中的信息: 響應處理。
$response = $caller->DoDirectPayment($ddp);
此響應中返回的各種字段提供了有關事務成功的信息,以及事務的 ID。通過存儲此 ID 并將它提供給后面的 API 調用,應用程序將能夠獲取有關事務的詳細信息,并將根據這些信息生成另一個表格。
$d =& Services_PayPal::getType('GetTransactionDetailsRequestType');
$d->setTransactionId('');
$response = $caller->GetTransactionDetails($d);
無法使用 Web 控制臺
在撰寫本文時,隨上述 SDK 下載一起提供的 Web 控制臺由于丟失了重要目錄而停止工作。 然而,此時可以下載包含所有必需文件的存檔。 控制臺能夠測試 API 調用,生成 PHP 代碼片斷,從而達成您的目標。 通過本文和 SDK 參考中的一些調查,您可以通過瀏覽器方便地查看從 Sandbox 發出的所有 API 調用。
快速結帳流程
快速結帳方式介于強大的直接付款方式和簡捷的標準結帳方式之間。 利用快速結帳和基于 API 的方法,用戶可以在您的網站完成訂單創建過程,然后轉至 PayPal 處理所有帳單和發貨信息。 在使用快速結帳時,用戶只需為所有商品輸入一次帳戶信息,而您的應用程序也不需要存儲這些信息 — 這在安全性和開發方面具有明顯的優勢。 同直接付款方式相同,通過存儲事務 ID,應用程序可以利用其他 API 調用獲取事物的詳細信息。 快速結帳可以利用上文中描述的 IPN,從而允許其它實時處理選項。 下面的代碼段來自 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);
此調用的結果將提供一個令牌,您可以將其添加到一個鏈路,或者在網站上將其重定向到 PayPal 。 然后,用戶使用 PayPal 處理業務。在操作成功或失敗后,系統將用戶重定向到您的網站。 在本示例中,調用的頁面返回將向您的應用程序發送以下 API 調用:
$ecd =& Services_PayPal::getType('GetExpressCheckoutDetailsRequestType');
$ecd->setToken('');
$response = $caller->GetExpressCheckoutDetails($ecd);
這里包含您需要的所有事務信息,但不包含信用卡號等敏感信息。 用戶在您的網站上對這些值進行確認后,由最終 API 調用處理資金事務:
$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);
同樣,在對 updateChart 進行連續調用時,ChartData 將引發 onResult 方法:
_root.chartData.onResult = function() {
_root.chart.throbber._visible = false;
drawChart(this);
}
快速結帳幾乎與直接付款具有相同的定制 性,同時還保持了標準結帳的保密和安全優勢。
PayPal 支付處理的任何一種形式都提供了收集在線付款的有效方式。 由實施者決定哪種方式更加適合: 標準結帳為小型機構提供了收集付款的能力,且不需要這些機構投資其它安全體系結構;在與當前的企業應用程序集成時,直接付款是理想的解決方案;而快速結帳 介于兩者之間,適合將其更改成第三方產品。 選擇靈活性、安全性和實施便捷性之間的平衡點將允許您利用現有的 Oracle 基礎架構獲得在線支付功能。
充分設置好環境后,您需要下載 PayPal PHP SDK,其中包括服務/ PayPal PEAR 程序包、 PayPal Web 控制臺、SDK 文檔和 PDF 信息文檔。 (參見下方“無法使用 Web 控制臺”部分中關于 Web 控制臺的重要注意事項。) 在下載和提取此文件后,您需要運行一些命令行操作:
pear install --alldeps /Services_PayPal/package.xml
cp -r /WebConsole
此命令可以安裝一些其它的 PEAR 程序包,為您提供一個功能完善的 PayPal SDK。 在瀏覽器中訪問 http://localhost/WebConsole 頁面后, PayPal 配置文件管理工具將顯示一條問候消息,您可以在此處檢查 PayPal SDK 的有效性。 常見問題包括丟失 cURL 或 SSL 的安裝,通過修改 php.ini 或重新編譯 PHP,然后再次運行 PEAR 命令,這些問題將得到修復。 如果因為托管限制或安全性問題而無法安裝 PEAR 或某種必要的擴展功能,您還可以使用下方描述的標準結帳。
采用穩妥的方式……
通過 SDK 使用 API 是使用 PayPal 功能的一種靈活、有效的方式。 API 支持的兩種支付方式包括:
直接付款:使用此方式可以收集網站上的詳細帳單,從用戶的信用卡收費,全 部工作在自己網站上完成。 這種方法適合擁有 https 安全應用程序和基礎架構(用于存儲客戶和購物車信息)的大型機構。
快速結帳:這種方式允許用戶使用 PayPal 帳戶信息和選擇發貨方式,不需要在網站上重新輸入信息,從而節省了時間。同時, 這種方式不需要應用程序存儲購買者信息的本地副本,管理此方式時只需要最少的額外安全性基礎架構。
其它 API 特性(文中并未完全涉及)包括:
慈善捐款:根據用戶的購物情況,提供有關 慈善捐款的實時信息。
發貨:如果 銷售的是現實產品,則允許用戶選擇發貨商、發貨方式、保險和其它屬性。 在用戶確實購買貨物之前,您就可以向用戶提供發貨的成本,或者也可以使用此特性在產品顯示頁面提供更準確的價格。
退款:提供向用戶退款的方法。
稅款:根據每件貨物或每個購物車收稅,并適當地將稅款顯示在收據和發票 上。
訂閱: 靈活地定義現實貨物和數字貨物的循環訂閱。
SDK 還提供了廣泛的 eBay 支持,盡管其價值不在我們討論的范圍內。
……或者采用簡易方式
如果 SDK 的功能遠遠超出用戶的需求,在此情況下,PayPal 提供了另一種解決方案。 標準結帳不使用 SOAP,只依賴于在應用程序與 PayPal 安全服務器間傳遞 HTML 表單值。 要使用標準結帳,您只需要生成一個表單,該表單可以提交適當的 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>
提交表單后,用戶將進入 PayPal 的服務器,輸入帳單信息。 在完成信息驗證和帳單授權機制后,用戶將返回您在網站上定義的一個位置。 如果您僅僅是收集捐款,而不是銷售物品,那么您的工作已經完成了! 然而,對于其它情況,用戶可使用大量的變量來定制功能、貨幣和顯示方面的體驗。 (參見參考指南。)
使用帶有 notify_url 變量的即時付款通知 (IPN) 時,一旦用戶在指定的地點完成付款,您的應用程序就會得到通知 — 您可以使用定制的鏈接提供專用用戶標識,例如,允許對在線內容進行即時訪問或觸發一個批發商的訂單。 另外,通過使用發票和定制變量,您可以創建一個機構,將 PayPal 的記錄限制在您自己的域中。 如果應用程序已經保存了用戶名和地址信息,您可以通過一組變量(包括 address1 、city 和 country)將這些信息傳遞給 PayPal ,以便預先填充相應的字段。
標準結帳的基本方式 中也包含 API 為收集非盈利性資金而提供的許多特性, 例如,可以應用到每個購物車或每件貨物的稅款、處理和發貨變量。
cpp_ 系列變量(包括 cpp_header_image、cpp_headerback_color、cpp_headerborder_color 和 cs)允許您精確調整用戶在 PayPal 服務器上的體驗,這些變量用于設置支付頁面的背景顏色。 如果這種方法能夠滿足應用程序的需求,標準結帳將是一種非常經濟有效的解決方案。 與基于 API 的直接付款方式不同,標準結帳并不確定每月的費用,并且實施期間的開發工作非常少。
準備付款
要使用 PayPal API,首先要熟悉開發人員中心。 您將在開發人員中心建立帳戶,以便在 Sandbox 中創建買方與賣方的示例帳戶。 示例帳戶創建完畢后,使用該帳戶登錄到 Sandbox 將顯示擁有資金的有效 PayPal 帳戶。 您的買方可以從其他 Sandbox 帳戶購買物品,您的賣方可以將貨款退還給其他 Sandbox 帳戶,這些都不需要現金轉移,也不需要收費代理。 PayPal 的集成中心提供了極好的逐步指南(注意,第 3 步是我在前面介紹的安裝過程),我將在此處提供該指南的概述。
首先,您需要在 developer.paypal.com 注冊一個帳戶,此網頁是訪問各種開發人員資源的中心點,用于創建 Sandbox 帳戶。 之后,您將在 developer.paypal.com 的 Sandbox 選項卡中創建一個買方示例和一個賣方示例。這項工作非常簡單,為了使創建的內容有意義,您只需要足夠的創造力。 例如,在提示您輸入銀行帳戶信息時,為了方便使用,建議您將系統提供的虛擬帳戶號作為銀行的名稱。 另外,您可以為買方帳戶和賣方帳戶使用相同的密碼,因為此服務器發生密碼泄露的風險很低。 在 Sandbox 中學習的特性與生產時使用的特性完全相同,從而減少了培訓和測試時間。
在 Sandbox 中最后一個重要的步驟是創建測試證書,這是一個小型文本文件,其中包含將與每個 API 調用一起使用的密鑰。 要創建一個證書,您需要登錄到賣方 Sandbox 帳戶,單擊 Profile,然后依次選擇 API Access 和 View or Remove Credentials。 記錄此文件和密碼;您將在配置應用程序時用到它們。
回到 developer.paypal.com,您可以查看測試證書的信息,也可以從 Test Certificates 選項卡下載測試證書。 此處不能查看 API 密碼;要獲得此信息,您必須重新登錄到 http://www.sandbox.paypal.com,然后訪問上述位置。
直接付款處理
與 PayPal 交互的最靈活的方式是通過 SDK 來完成,SDK 會將基于 SOAP 的請求抽象成可管理的信息。 不同調用要完成的目標不同,但執行的步驟基本相同: 認證、操作和響應流程。 第一個步驟,認證,來自 SDK 示例,同樣需要用在下方的快速結帳方法中。 顯示的值用于 Sandbox 測試: 需要為生產創建帶有認證詳細信息的新證書。
$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);
認證完成后,應用程序已經準備好處理 API 請求。 在直接付款時,您的應用程序必須有能力、有責任創建和存儲訂單的狀態,并為訂單創建收據: 在下一個示例中,我們將假定應用程序已將所有相關信息存儲到以下表格中: Customer、Billing_Method、Order 和 Line_item。 本示例使用 PHP 數據對象 (PDO),在此情況下,傳統的 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);
此時, PayPal 執行請求的直接付款。 為了解發生的情況,現在,應用程序會獲取第三步中的信息: 響應處理。
$response = $caller->DoDirectPayment($ddp);
此響應中返回的各種字段提供了有關事務成功的信息,以及事務的 ID。通過存儲此 ID 并將它提供給后面的 API 調用,應用程序將能夠獲取有關事務的詳細信息,并將根據這些信息生成另一個表格。
$d =& Services_PayPal::getType('GetTransactionDetailsRequestType');
$d->setTransactionId('');
$response = $caller->GetTransactionDetails($d);
無法使用 Web 控制臺
在撰寫本文時,隨上述 SDK 下載一起提供的 Web 控制臺由于丟失了重要目錄而停止工作。 然而,此時可以下載包含所有必需文件的存檔。 控制臺能夠測試 API 調用,生成 PHP 代碼片斷,從而達成您的目標。 通過本文和 SDK 參考中的一些調查,您可以通過瀏覽器方便地查看從 Sandbox 發出的所有 API 調用。
快速結帳流程
快速結帳方式介于強大的直接付款方式和簡捷的標準結帳方式之間。 利用快速結帳和基于 API 的方法,用戶可以在您的網站完成訂單創建過程,然后轉至 PayPal 處理所有帳單和發貨信息。 在使用快速結帳時,用戶只需為所有商品輸入一次帳戶信息,而您的應用程序也不需要存儲這些信息 — 這在安全性和開發方面具有明顯的優勢。 同直接付款方式相同,通過存儲事務 ID,應用程序可以利用其他 API 調用獲取事物的詳細信息。 快速結帳可以利用上文中描述的 IPN,從而允許其它實時處理選項。 下面的代碼段來自 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);
此調用的結果將提供一個令牌,您可以將其添加到一個鏈路,或者在網站上將其重定向到 PayPal 。 然后,用戶使用 PayPal 處理業務。在操作成功或失敗后,系統將用戶重定向到您的網站。 在本示例中,調用的頁面返回將向您的應用程序發送以下 API 調用:
$ecd =& Services_PayPal::getType('GetExpressCheckoutDetailsRequestType');
$ecd->setToken('');
$response = $caller->GetExpressCheckoutDetails($ecd);
這里包含您需要的所有事務信息,但不包含信用卡號等敏感信息。 用戶在您的網站上對這些值進行確認后,由最終 API 調用處理資金事務:
$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);
同樣,在對 updateChart 進行連續調用時,ChartData 將引發 onResult 方法:
_root.chartData.onResult = function() {
_root.chart.throbber._visible = false;
drawChart(this);
}
快速結帳幾乎與直接付款具有相同的定制 性,同時還保持了標準結帳的保密和安全優勢。
PayPal 支付處理的任何一種形式都提供了收集在線付款的有效方式。 由實施者決定哪種方式更加適合: 標準結帳為小型機構提供了收集付款的能力,且不需要這些機構投資其它安全體系結構;在與當前的企業應用程序集成時,直接付款是理想的解決方案;而快速結帳 介于兩者之間,適合將其更改成第三方產品。 選擇靈活性、安全性和實施便捷性之間的平衡點將允許您利用現有的 Oracle 基礎架構獲得在線支付功能。
posted @ 2010-06-23 09:12 lina 閱讀(1225) | 評論 (0) | 編輯 收藏