Php 我的paypal express结帐付款有问题吗?
我是paypal express收银台的新手,我有这个代码来支付paypalPhp 我的paypal express结帐付款有问题吗?,php,paypal,Php,Paypal,我是paypal express收银台的新手,我有这个代码来支付paypal $resArray = CallShortcutExpressCheckout ($paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL); $ack = strtoupper($resArray["ACK"]); if($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING") { Red
$resArray = CallShortcutExpressCheckout ($paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL);
$ack = strtoupper($resArray["ACK"]);
if($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING")
{
RedirectToPayPal ( $resArray["TOKEN"] );
}
else
{
//Display a user friendly Error on the page using any of the following error information returned by PayPal
$ErrorCode = urldecode($resArray["L_ERRORCODE0"]);
$ErrorShortMsg = urldecode($resArray["L_SHORTMESSAGE0"]);
$ErrorLongMsg = urldecode($resArray["L_LONGMESSAGE0"]);
$ErrorSeverityCode = urldecode($resArray["L_SEVERITYCODE0"]);
echo "SetExpressCheckout API call failed. ";
echo "Detailed Error Message: " . $ErrorLongMsg;
echo "Short Error Message: " . $ErrorShortMsg;
echo "Error Code: " . $ErrorCode;
echo "Error Severity Code: " . $ErrorSeverityCode;
}
这是CallShortcutExpressCheckout函数的代码
function CallShortcutExpressCheckout( $paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL)
{
//------------------------------------------------------------------------------------------------------------------------------------
// Construct the parameter string that describes the SetExpressCheckout API call in the shortcut implementation
$nvpstr="&PAYMENTREQUEST_0_AMT=". $paymentAmount;
$nvpstr = $nvpstr . "&PAYMENTREQUEST_0_PAYMENTACTION=" . $paymentType;
$nvpstr = $nvpstr . "&RETURNURL=" . $returnURL;
$nvpstr = $nvpstr . "&CANCELURL=" . $cancelURL;
$nvpstr = $nvpstr . "&PAYMENTREQUEST_0_CURRENCYCODE=" . $currencyCodeType;
$_SESSION["currencyCodeType"] = $currencyCodeType;
$_SESSION["PaymentType"] = $paymentType;
//'---------------------------------------------------------------------------------------------------------------
//' Make the API call to PayPal
//' If the API call succeded, then redirect the buyer to PayPal to begin to authorize payment.
//' If an error occured, show the resulting errors
//'---------------------------------------------------------------------------------------------------------------
$resArray=hash_call("SetExpressCheckout", $nvpstr);
$ack = strtoupper($resArray["ACK"]);
if($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING")
{
$token = urldecode($resArray["TOKEN"]);
$_SESSION['TOKEN']=$token;
}
return $resArray;
}
我的问题是,我不知道如何发送购物车的完整信息,如产品标题和代码,这是我需要的,因为我没有订单部分到我的购物车,我想通过电子邮件管理一切
因此,我需要的是通过订单发送产品说明,一旦收到订单电子邮件确认,我就要做同样的事情 首先,我要说,我已经试着让整个结账工作了2天,但我仍然没有完全成功:( 然而,看起来我比你更进一步 虽然不确定这是不是正确的方法,但我会告诉你我现在得到了什么以及我还有什么问题 我所做的是: 如果用户单击checkout按钮,将调用一个php文件(我们称之为
checkout.php
)
在checkout.php
文件中,我用用户想要订购的物品构建了一个数组
// fill array with two products
// normally you would loop through all products in the basket to create this array
$items = array('L_PAYMENTREQUEST_0_NAME0'=>'Productname 1',
'L_PAYMENTREQUEST_0_NUMBER0'=>'Productcode 1',
'L_PAYMENTREQUEST_0_DESC0'=>'Productdescription 1',
'L_PAYMENTREQUEST_0_AMT0'=>39.99, // price per unit
'L_PAYMENTREQUEST_0_QTY0'=>2, // quantity
'L_PAYMENTREQUEST_0_NAME1'=>'Productname 2',
'L_PAYMENTREQUEST_0_NUMBER1'=>'Productcode 2',
'L_PAYMENTREQUEST_0_DESC1'=>'Productdescription 2',
'L_PAYMENTREQUEST_0_AMT1'=>200.99,
'L_PAYMENTREQUEST_0_QTY1'=>1,
);
// set total amount of order in session (this will be used by paypal throughout the payment process)
$_SESSION['Payment_Amount'] = 280.97;
// now normally call CallShortcutExpressCheckout only with the addition of the $items array
$resArray = CallShortcutExpressCheckout ($paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL, $items);
现在,对于包含实际向PayPal发出请求的函数的文件:
我创建了一个额外的函数(generate\u nvp\u string
),并将CallShortcutExpressCheckout
函数更改为使用此字符串
function generate_nvp_string($paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL, $items = array())
{
$params = array('PAYMENTREQUEST_0_AMT'=>$paymentAmount,
'PAYMENTREQUEST_0_PAYMENTACTION'=>$paymentType,
'RETURNURL'=>$returnURL,
'CANCELURL'=>$cancelURL,
'PAYMENTREQUEST_0_CURRENCYCODE'=>$currencyCodeType,
);
$params = array_merge($params, $items);
$nvp_string = '';
foreach($params as $name => $value) {
$nvp_string.= '&'.$name.'='.$value;
}
return $nvp_string;
}
function CallShortcutExpressCheckout($paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL, $items= array())
{
$_SESSION['currencyCodeType'] = $this->currency;
$_SESSION['PaymentType'] = $this->payment_type;
$result = $this->hash_call('SetExpressCheckout', $this->generate_nvp_string($paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL, $items));
$ack = strtoupper($result['ACK']);
if ($ack == 'SUCCESS' || $ack == 'SUCCESSWITHWARNING') {
$_SESSION['TOKEN'] = urldecode($result['TOKEN']);
}
return $result;
}
现在,当用户单击checkout按钮时,请求字符串也将包括产品。当用户被重定向到PayPal checkout时,他们将对所有订购的产品有一个很好的概述
我从以下几点开始回答:
我还有一个问题
但是,当用户完成签出过程并被重定向回我的站点($returnURL
)并且由于某种原因无法获得交易ID时,签出过程现在似乎可以工作了
交易ID对于能够在后端进一步处理付款非常重要。我试图使用表单提交来循环项目。PayPal的示例代码仅适用于1个项目。我没有创建类似PeeHaa的函数,而是检查是否设置了L_PAYMENTREQUEST_0_NAME0,如果设置了,则将所有变量添加到$nvpstr字符串。然后继续,查看是否设置了L_PAYMENTREQUEST_0_NAME1,如果设置了,请将其添加到字符串中,等等。以下是需要它的任何人的代码:
for($i=0; $i<99999; $i++){
if(isset($paramsArray["L_PAYMENTREQUEST_0_NAME$i"])){
$nvpstr = $nvpstr . "&L_PAYMENTREQUEST_0_NAME$i=" . $paramsArray["L_PAYMENTREQUEST_0_NAME$i"];
}
if(isset($paramsArray["L_PAYMENTREQUEST_0_NUMBER$i"])){
$nvpstr = $nvpstr . "&L_PAYMENTREQUEST_0_NUMBER$i=" . $paramsArray["L_PAYMENTREQUEST_0_NUMBER$i"];
}
if(isset($paramsArray["L_PAYMENTREQUEST_0_DESC$i"])){
$nvpstr = $nvpstr . "&L_PAYMENTREQUEST_0_DESC$i=" . $paramsArray["L_PAYMENTREQUEST_0_DESC$i"];
}
if(isset($paramsArray["L_PAYMENTREQUEST_0_AMT$i"])){
$nvpstr = $nvpstr . "&L_PAYMENTREQUEST_0_AMT$i=" . $paramsArray["L_PAYMENTREQUEST_0_AMT$i"];
}
if(isset($paramsArray["L_PAYMENTREQUEST_0_QTY$i"])){
$nvpstr = $nvpstr . "&L_PAYMENTREQUEST_0_QTY$i=" . $paramsArray["L_PAYMENTREQUEST_0_QTY$i"];
}
if(!isset($paramsArray["L_PAYMENTREQUEST_0_NAME$i"])){
break;
}
}
$i=0;$i的