2011-11-03 79 views
1

在我的網站上用戶可以用物品填寫他們的訂單筐。用PayPal結賬我的訂單筐

一旦完成,他們可以點擊結帳按鈕。

我希望他們使用PayPal結帳。

一旦用戶點擊結賬按鈕,用戶將被重定向到PayPal,並看到要支付的產品概覽。

如果用戶完成支付流程,用戶將被重定向到我的成功頁面。

但是,我期望成功頁面也收到付款的交易ID,但貝寶只發回一個令牌和一個payerid。

我結賬形式如下:

<form action="/en/checkout"> 
    <input type="submit" name="submit" value="Checkout"> 
</form> 

我的代碼,不會結帳是:

function checkoutAction() 
{ 
    $request = $this->getRequest(); 

    require_once(LIB_PATH.'/MFW/Paypal/Flows/Paypal_NVP.php'); 
    $paypal_nvp = new MFW_Paypal_NVP(); 

    // this should normally be filled by looping though the basket items 
    $data = array('L_PAYMENTREQUEST_0_NAME0'=>'Single License', 
        'L_PAYMENTREQUEST_0_NUMBER0'=>'1111-2222-3333-4444-5555-6666-7777-8888', 
        'L_PAYMENTREQUEST_0_AMT0'=>39.99, // or enterprise 299.00 
        'L_PAYMENTREQUEST_0_QTY0'=>1, 
       ); 

    $_SESSION['Payment_Amount'] = 39.99; 

    $result = $paypal_nvp->CallShortcutExpressCheckout(59.98, $data); 

    $ack = strtoupper($result['ACK']); 
    if($ack == 'SUCCESS' || $ack == 'SUCCESSWITHWARNING') { 
     $paypal->RedirectToPayPal($result['TOKEN']); 
     exit(); 
    } 
} 

在Paypal_NCP類的代碼:

function generate_nvp_string($total_value, $data = array()) 
{ 
    $params = array('PAYMENTREQUEST_0_AMT'=>$total_value, 
        'PAYMENTREQUEST_0_PAYMENTACTION'=>$this->payment_type, 
        'RETURNURL'=>$this->return_url, 
        'CANCELURL'=>$this->cancel_url, 
        'PAYMENTREQUEST_0_CURRENCYCODE'=>$this->currency, 
        ); 

    $params = array_merge($params, $data); 

    $nvp_string = ''; 
    foreach($params as $name => $value) { 
     $nvp_string.= '&'.$name.'='.$value; 
    } 

    // example string 
    // &PAYMENTREQUEST_0_AMT=39.99&PAYMENTREQUEST_0_PAYMENTACTION=Sale&RETURNURL=http://return-address&CANCELURL=http://cancel-address&PAYMENTREQUEST_0_CURRENCYCODE=EUR&L_PAYMENTREQUEST_0_NAME0=Single License&L_PAYMENTREQUEST_0_NUMBER0=1111-2222-3333-4444-5555-6666-7777-8888&L_PAYMENTREQUEST_0_AMT0=39.99&L_PAYMENTREQUEST_0_QTY0=1 

    return $nvp_string; 
} 

function CallShortcutExpressCheckout($total_value, $data = array()) 
{ 
    $_SESSION['currencyCodeType'] = $this->currency; 
    $_SESSION['PaymentType'] = $this->payment_type; 

    $result = $this->hash_call('SetExpressCheckout', $this->generate_nvp_string($total_value, $data)); 

    $ack = strtoupper($result['ACK']); 
    if ($ack == 'SUCCESS' || $ack == 'SUCCESSWITHWARNING') { 
     $_SESSION['TOKEN'] = urldecode($result['TOKEN']); 
    } 

    return $result; 
} 

那麼怎麼辦我得到的交易信息讓我能夠在後臺處理付款事宜? (我需要一個交易ID爲此)

回答

1

您只調用SetExpressCheckout。爲了使用Express Checkout完成交易,您還必須調用(可選)GetExpressCheckoutDetails以獲取PayerID(買方的唯一標識符)和(必需)DoExpressCheckoutPayment。

回顧:
要使用Express Checkout,您可以調用SetExpressCheckout API。在API調用中,您可以指定產品,金額和RETURNURL的詳細信息。這就是你在上面的代碼中所做的。
將這些數據發佈到PayPal的API端點後,您會收到一個令牌。然後,您將重定向買方,並將令牌附加到以下URL:https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-XXXXXXX

買方同意您的購買後,他將重定向回您在RETURNURL中指定的URL。
您現在應該顯示訂單確認信息,並調用GetExpressCheckoutDetails API **。 當調用GetExpressCheckoutDetails時,提供令牌。在GetExpressCheckoutDetails API響應中,您會找到一個PayerID。

現在您已準備好致電DoExpressCheckoutPayment並向買方收費。請記住在調用DoExpressCheckoutPayment時包含令牌和payerID。

關於IPN:您不再需要它了,因爲您還將TransactionID返回到DoExpressCheckoutPayment的API響應中。 如果您以後想要跟蹤交易,IPN將非常有用。例如,在退款/退款等情況下會收到通知。
這隻需要設置一個IPN腳本,並在SetExpressCheckout和DoExpressCheckoutPayment中均包含NOTIFYURL = http:// ....

** PayerID也附加在您的RETURNURL的GET中。所以如果你願意,你可以跳過調用GetExpressCheckoutDetails。

(在Why is DoExpressCheckoutPayment required for Paypal?我的答案的部分副本)

+0

沒有用過你已經發布什麼,但看起來非常有前途。我會去嘗試一下。我真的很討厭問愚蠢的問題或RTFM手動問題。但PayPal的文檔只是我一生中遇到過的最糟糕的文檔。不可能在那裏找到任何東西。我還不需要IPN來檢查付款狀態。電子支票和東西(可能需要一些時間來處理/驗證)? – PeeHaa

+1

是的,爲了跟蹤創建後的交易,您可以使用IPN。但這不是必需的。在您呼叫DoExpressCheckoutPayment並收到ACK =成功響應後,您還將獲得PAYMENTSTATUS =已完成或待定。 – Robert