Php 如何集成贝宝快捷结账?

Php 如何集成贝宝快捷结账?,php,paypal,wordpress,paypal-sandbox,Php,Paypal,Wordpress,Paypal Sandbox,我正在开发一个wordpress插件,它需要PayPal Express的结账功能 我在paypal网站上关注这篇关于如何集成上下文内签出功能()的文章,这篇文章在第一步中给出了以下形式 <form method=post action=https://api-3t.sandbox.paypal.com/nvp> <input type=hidden name=USER value=API_username> <input type=hidden n

我正在开发一个wordpress插件,它需要PayPal Express的结账功能

我在paypal网站上关注这篇关于如何集成上下文内签出功能()的文章,这篇文章在第一步中给出了以下形式

<form method=post action=https://api-3t.sandbox.paypal.com/nvp>
    <input type=hidden name=USER value=API_username>
    <input type=hidden name=PWD value=API_password>
    <input type=hidden name=SIGNATURE value=API_signature>
    <input type=hidden name=VERSION value=XX.0>
    <input type=hidden name=PAYMENTREQUEST_0_PAYMENTACTION value=Sale>
    <input name=PAYMENTREQUEST_0_AMT value=19.95>
    <input type=hidden name=RETURNURL value=https://www.YourReturnURL.com>
    <input type=hidden name=CANCELURL value=https://www.YourCancelURL.com>
    <input type=submit name=METHOD value=SetExpressCheckout>
</form>

由于这个原因,我无法进入PayPal文档的第2步,所以这里需要帮助。我做错了什么?

要实现PayPal Express签出,您需要执行一些服务器端代码(PHP、ASP.Net等)。您试图做的是一个无法工作的HTML表单。 您必须执行3个API调用来验证全额付款

  • GetExpressCheckoutDetails

在每次调用中,您都将使用您的API凭据。

尝试我在项目中使用的代码,它可以正常工作

PHP:

HTML:


我建议实现PayPal Express签出API

使用这种方法来代替创建wordpress插件有很多好处。主要原因是响应将立即传递,并且您不会使用IPN方法来检查事务是否成功。您还可以在一个会话中添加多个定期和一次性付款,包括税费和福利。你将有自由添加所有这些东西,几乎所有的东西-这是你的wordpress插件需要酷

这正是我们的建议。下面是一个简单的(PHP)示例,说明如何设置多个产品的交易(也包括定期付款):

//SetExpressCheckout的参数,将发送到PayPal
$padata['L_BILLINGAGREEMENTDESCRIPTION0']=“产品说明”; $padata['L_BILLINGAGREEMENTDESCRIPTION0']=$padata['L_BILLINGAGREEMENTDESCRIPTION0']。 “$”.$product->price.“/月”; $padata['L_PAYMENTREQUEST_0_DESC0']=$padata['L_BILLINGAGREEMENTDESCRIPTION0']。 “$”.$product->price.“/月”
$padata['PAYMENTREQUEST\u 0\u NOTIFYURL']='http://site_url/paypal/ipn'; $padata['PAYMENTREQUEST\u 0\u DESC']=$product->name; $padata['RETURNURL']='http://site_url/paypal/returnurl'; $padata['CANCELURL']='http://site_url/paypal/cancelurl';
$padata['PAYMENTREQUEST_0_CURRENCYCODE']='USD'; $padata['PAYMENTREQUEST_0_PAYMENTACTION']=“销售”; $padata['PAYMENTREQUEST\u 0\u ITEMAMT']=$product->price
$padata['PAYMENTREQUEST\u 0\u AMT']=$product->price
$padata['L_BILLINGTYPE0']='RecurringPayments'
$padata['L_PAYMENTREQUEST_0_NAME0']=$product->name
$padata['L_PAYMENTREQUEST_0_NUMBER0']='322'
$padata['L_PAYMENTREQUEST_0_QTY0']='1'
$padata['L_PAYMENTREQUEST_0_AMT0']=$product->price; $padata['L_PAYMENTREQUEST_0_NAME1']=“第二个产品名称”
$hosteddata['L_PAYMENTREQUEST_0_DESC1']=“第二个产品说明”
$hosteddata['L_PAYMENTREQUEST_0_NUMBER1']=$secondproduct->id
$hosteddata['L_PAYMENTREQUEST_0_QTY1']='1'
$hosteddata['L_PAYMENTREQUEST_0_AMT1']=$secondproduct->price; $paypal\u data=http\u build\u query($padata); $httpParsedResponseAr=$this->PPHttpPost('SetExpressCheckout',$paypal_data); //根据我们从贝宝收到的信息回复 if(“SUCCESS”==strotupper($httpParsedResponseAr[“ACK”])| |“SUCCESSWITHWARNING”==strotupper($httpParsedResponseAr[“ACK”])){ //将用户重定向到收到令牌的PayPal商店。 $paypalurl=https://www.paypal.com/cgi-bin/webscr?cmd=_express-签出和令牌=“.$httpParsedResponseAr[“令牌”]”; 标题('Location:'。$paypalurl); }否则{ echo“Error:”.urldecode($httpParsedResponseAr[“L_LONGMESSAGE0”])。”;
} 页面返回URL:

$hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'] = 'Recurring Description';
$hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'] = $hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'] . ' $'.$pr->price.'/month';
$hosteddata['L_PAYMENTREQUEST_0_NAME0'] = $pr->name;
$hosteddata['PROFILEREFERENCE'] = $GetExpressCheckoutDetails['L_PAYMENTREQUEST_0_NUMBER0'];
$hosteddata['PROFILESTARTDATE'] = date('Y-m-d') . 'T' . date('H:i:s').'Z';
$hosteddata['SUBSCRIBERNAME'] = $GetExpressCheckoutDetails['FIRSTNAME'] . ' ' . $GetExpressCheckoutDetails['LASTNAME'];
$hosteddata['TOKEN'] = urlencode($_POST['token']);
$hosteddata['DESC'] = $hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'];
$hosteddata['AMT'] = $pr->price;
$hosteddata['BILLINGPERIOD'] = 'Month';
$hosteddata['BILLINGFREQUENCY'] = '1';
$hosteddata['TOTALBILLINGCYCLES'] = '12';
$hosteddata['REGULARTOTALBILLINGCYCLES'] = '1';
$hosteddata['VERSION'] = '74.0';
$hosteddata['MAXFAILEDPAYMENTS'] = '1';
$hosteddata['L_PAYMENTREQUEST_0_QTY0'] = '1';
$hosteddata['L_BILLINGTYPE0'] = 'RecurringPayments';
$hosteddata['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = 'Digital';
$hosteddata['L_PAYMENTREQUEST_0_AMT0'] = $pr->price;
$hosteddata['INITAMT'] = $pr->price;
$hosteddata['L_PAYMENTREQUEST_0_NUMBER0'] = $pr->id;
$hosteddata['PAYMENTREQUEST_0_NOTIFYURL'] = 'http://site_url/paypal/ipn';
$padata['L_PAYMENTREQUEST_0_NAME1'] = 'Second Product name'; $hosteddata['L_PAYMENTREQUEST_0_DESC1'] = 'second product description';
$hosteddata['L_PAYMENTREQUEST_0_NUMBER1'] = $secondproduct->id;
$hosteddata['L_PAYMENTREQUEST_0_QTY1'] = '1';
$hosteddata['L_PAYMENTREQUEST_0_AMT1'] = $secondproduct->price; $paypal_data = http_build_query($hosteddata); $hosted_saas_response = $this->PPHttpPost('CreateRecurringPaymentsProfile', $paypal_data);
$hosteddata['L_BILLINGAGREEMENTDESCRIPTION0']=“定期描述”
$hosteddata['L_BILLINGAGREEMENTDESCRIPTION0']=$hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'].$$公关->价格。'/月'
$hosteddata['L_PAYMENTREQUEST_0_NAME0']=$pr->name
$hosteddata['PROFILEREFERENCE']=$GetExpressCheckoutDetails['L_PAYMENTREQUEST_0_NUMBER0']
$hosteddata['PROFILESTARTDATE']=日期('Y-m-d')。'T’。日期('H:i:s')。'Z'
$hosteddata['SUBSCRIBERNAME']=$GetExpressCheckoutDetails['FIRSTNAME'].'$GetExpressCheckoutDetails['LASTNAME']
$hosteddata['TOKEN']=urlencode($_POST['TOKEN'])
$hosteddata['DESC']=$hosteddata['L_BILLINGAGREEMENTDESCRIPTION0']
$hosteddata['AMT']=$pr->price
$hosteddata['BILLINGPERIOD']='Month'
$hosteddata['BILLINGFREQUENCY']='1'
$hosteddata['TOTALBILLINGCYCLES']='12'
$hosteddata['REGULARTOTALBILLINGCYCLES']='1'
$hosteddata['VERSION']='74.0'
$hosteddata['MAXFAILEDPAYMENTS']='1'
$hosteddata['L_PAYMENTREQUEST_0_QTY0']='1'
$hosteddata['L_BILLINGTYPE0']='RecurringPayments'
$hosteddata['L_PAYMENTREQUEST_0_ITEMCATEGORY0']='Digital'
$hosteddata['L_PAYMENTREQUEST_0_AMT0']=$pr->price
$hosteddata['INITAMT']=$pr->price
$hosteddata['L_PAYMENTREQUEST_0_NUMBER0']=$pr->id
$hosteddata['PAYMENTREQUEST\u 0\u NOTIFYURL']='http://site_url/paypal/ipn';
$padata['L_PAYMENTREQUEST_0_NAME1']=“第二个产品名称”; $hosteddata['L_PAYMENTREQUEST_0_DESC1']=“第二个产品说明”
$hosteddata['L_PAYMENTREQUEST_0_NUMBER1']=$secondproduct->id
$hosteddata['L_PAYMENTREQUEST_0_QTY1']='1'
$hosteddata['L_PAYMENTREQUEST_0_AMT1']=$secondproduct->price; $paypal\u data=http\u build\u query($hosteddata); $hosted_saas_response=$this->PPHttpPost('CreateRecurringPaymentsProfile',$paypal_data)
我使用了单独的冰毒
$paypal_url='https://www.paypal.com/cgi-bin/webscr'; 
$paypal_id='example@example.com';
<form action='<?php echo $paypal_url; ?>' method='post' name='frmPayPal1'>
    <input type='hidden' name='business' value='<?php echo $paypal_id;?>'>
    <input type='hidden' name='cmd' value='_xclick'>
    <input type='hidden' name='item_name' value='Products Total'>
    <input type='hidden' name='amount' value='<?php echo $tot;?>'>
    <input type='hidden' name='no_shipping' value='1'>
    <input type='hidden' name='currency_code' value='USD'>
    <input type='hidden' name='handling' value='0'>
    <input type='hidden' name='cancel_return' value='http://localhost/paypal/cancel.php'>
    <input type='hidden' name='return' value='http://localhost/paypal/success.php'>
    <input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
    <img alt="" border="0" src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
// Parameters for SetExpressCheckout, which will be sent to PayPal
$padata['L_BILLINGAGREEMENTDESCRIPTION0'] = 'Product description'; $padata['L_BILLINGAGREEMENTDESCRIPTION0'] = $padata['L_BILLINGAGREEMENTDESCRIPTION0'] . ' $'.$product->price.'/month'; $padata['L_PAYMENTREQUEST_0_DESC0'] = $padata['L_BILLINGAGREEMENTDESCRIPTION0'] . ' $'.$product->price.'/month';
$padata['PAYMENTREQUEST_0_NOTIFYURL'] = 'http://site_url/paypal/ipn'; $padata['PAYMENTREQUEST_0_DESC'] = $product->name; $padata['RETURNURL'] = 'http://site_url/paypal/returnurl'; $padata['CANCELURL'] = 'http://site_url/paypal/cancelurl';
$padata['PAYMENTREQUEST_0_CURRENCYCODE'] = 'USD'; $padata['PAYMENTREQUEST_0_PAYMENTACTION'] = 'SALE'; $padata['PAYMENTREQUEST_0_ITEMAMT'] = $product->price;
$padata['PAYMENTREQUEST_0_AMT'] = $product->price;
$padata['L_BILLINGTYPE0'] = 'RecurringPayments';
$padata['L_PAYMENTREQUEST_0_NAME0'] = $product->name;
$padata['L_PAYMENTREQUEST_0_NUMBER0'] = '322';
$padata['L_PAYMENTREQUEST_0_QTY0'] = '1';
$padata['L_PAYMENTREQUEST_0_AMT0'] = $product->price; $padata['L_PAYMENTREQUEST_0_NAME1'] = 'Second Product name';
$hosteddata['L_PAYMENTREQUEST_0_DESC1'] = 'second product description';
$hosteddata['L_PAYMENTREQUEST_0_NUMBER1'] = $secondproduct->id;
$hosteddata['L_PAYMENTREQUEST_0_QTY1'] = '1';
$hosteddata['L_PAYMENTREQUEST_0_AMT1'] = $secondproduct->price; $paypal_data = http_build_query($padata); $httpParsedResponseAr = $this->PPHttpPost('SetExpressCheckout', $paypal_data); //Respond according to message we receive from Paypal if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])){ //Redirect user to PayPal store with Token received. $paypalurl ='https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token='.$httpParsedResponseAr["TOKEN"].''; header('Location: '.$paypalurl); }else{ echo 'Error : '.urldecode($httpParsedResponseAr["L_LONGMESSAGE0"]).'';
} $hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'] = 'Recurring Description';
$hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'] = $hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'] . ' $'.$pr->price.'/month';
$hosteddata['L_PAYMENTREQUEST_0_NAME0'] = $pr->name;
$hosteddata['PROFILEREFERENCE'] = $GetExpressCheckoutDetails['L_PAYMENTREQUEST_0_NUMBER0'];
$hosteddata['PROFILESTARTDATE'] = date('Y-m-d') . 'T' . date('H:i:s').'Z';
$hosteddata['SUBSCRIBERNAME'] = $GetExpressCheckoutDetails['FIRSTNAME'] . ' ' . $GetExpressCheckoutDetails['LASTNAME'];
$hosteddata['TOKEN'] = urlencode($_POST['token']);
$hosteddata['DESC'] = $hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'];
$hosteddata['AMT'] = $pr->price;
$hosteddata['BILLINGPERIOD'] = 'Month';
$hosteddata['BILLINGFREQUENCY'] = '1';
$hosteddata['TOTALBILLINGCYCLES'] = '12';
$hosteddata['REGULARTOTALBILLINGCYCLES'] = '1';
$hosteddata['VERSION'] = '74.0';
$hosteddata['MAXFAILEDPAYMENTS'] = '1';
$hosteddata['L_PAYMENTREQUEST_0_QTY0'] = '1';
$hosteddata['L_BILLINGTYPE0'] = 'RecurringPayments';
$hosteddata['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = 'Digital';
$hosteddata['L_PAYMENTREQUEST_0_AMT0'] = $pr->price;
$hosteddata['INITAMT'] = $pr->price;
$hosteddata['L_PAYMENTREQUEST_0_NUMBER0'] = $pr->id;
$hosteddata['PAYMENTREQUEST_0_NOTIFYURL'] = 'http://site_url/paypal/ipn';
$padata['L_PAYMENTREQUEST_0_NAME1'] = 'Second Product name'; $hosteddata['L_PAYMENTREQUEST_0_DESC1'] = 'second product description';
$hosteddata['L_PAYMENTREQUEST_0_NUMBER1'] = $secondproduct->id;
$hosteddata['L_PAYMENTREQUEST_0_QTY1'] = '1';
$hosteddata['L_PAYMENTREQUEST_0_AMT1'] = $secondproduct->price; $paypal_data = http_build_query($hosteddata); $hosted_saas_response = $this->PPHttpPost('CreateRecurringPaymentsProfile', $paypal_data);
private function PPHttpPost( $methodName_, $nvpStr_ ) {
$api_username = 'yourpaypal@email.com'; $api_password = 'QWEQWEWQEQWEQEQWE';
$api_signature = 'WQEQWEQWEQWEWQEQWEQWEQWEQWEQWE.cT';
$api_endpoint = "https://api-3t.paypal.com/nvp";
$version = '124.0'; $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_endpoint);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$api_password&USER=$api_username&SIGNATURE=$api_signature&$nvpStr_";
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
$httpResponse = curl_exec($ch);

if(!$httpResponse) { exit("$methodName_ failed: ".curl_error($ch).'('.curl_errno($ch).')');
}

// Extract the response details.
$httpResponseAr = explode("&", $httpResponse);
$httpParsedResponseAr = array();

foreach ($httpResponseAr as $i => $value) {
$tmpAr = explode("=", $value);
if(sizeof($tmpAr) > 1) {
$httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
}

} if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) {
exit("Invalid HTTP Response for POST request($nvpreq) to $api_endpoint.");
} return $httpParsedResponseAr;
}