2011-11-03 60 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