在我的网站上用户可以用物品填写他们的订单筐。用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为此)
没有用过你已经发布什么,但看起来非常有前途。我会去尝试一下。我真的很讨厌问愚蠢的问题或RTFM手动问题。但PayPal的文档只是我一生中遇到过的最糟糕的文档。不可能在那里找到任何东西。我还不需要IPN来检查付款状态。电子支票和东西(可能需要一些时间来处理/验证)? – PeeHaa
是的,为了跟踪创建后的交易,您可以使用IPN。但这不是必需的。在您呼叫DoExpressCheckoutPayment并收到ACK =成功响应后,您还将获得PAYMENTSTATUS =已完成或待定。 – Robert