我已经设置了快速结账。它做得很好。但是我想发送一些自定义值,并再次想要捕获它们。所以基本上我的索引.php是这样的
<form method="post" action="process.php?paypal=checkout">
<input type="hidden" name="itemname" value="Canon EOS Rebel XS" />
<input type="hidden" name="itemnumber" value="10000" />
<input type="hidden" name="itemdesc" value="Capture all your special moments with the Canon EOS Rebel XS/1000D DSLR camera and cherish the memories over and over again." />
<input type="hidden" name="itemprice" value="225.00" />
<input type='hidden' name='user_id' value='2'>
Quantity : <select name="itemQty"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select>
<input class="dw_button" type="submit" name="submitbutt" value="Buy (225.00 <?php echo PPL_CURRENCY_CODE; ?>)" />
</form>
然后进程.php文件是这样的
<?php
include_once("config.php");
include_once("functions.php");
include_once("paypal.class.php");
$paypal= new MyPayPal();
//Post Data received from product list page.
if(_GET('paypal')=='checkout'){
$products = [];
$products[0]['ItemName'] = _POST('itemname'); //Item Name
$products[0]['ItemPrice'] = _POST('itemprice'); //Item Price
$products[0]['ItemNumber'] = _POST('itemnumber'); //Item Number
$products[0]['ItemDesc'] = _POST('itemdesc'); //Item Number
$products[0]['ItemQty'] = _POST('itemQty'); // Item Quantity
$charges = [];
//Other important variables like tax, shipping cost
$charges['TotalTaxAmount'] = 0; //Sum of tax for all items in this order.
$charges['HandalingCost'] = 0; //Handling cost for this order.
$charges['InsuranceCost'] = 0; //shipping insurance cost for this order.
$charges['ShippinDiscount'] = 0; //Shipping discount for this order. Specify this as negative number.
$charges['ShippinCost'] = 0; //Although you may change the value later, try to pass in a shipping amount that is reasonably accurate.
$paypal->SetExpressCheckOut($products, $charges);
}
elseif(_GET('token')!=''&&_GET('PayerID')!=''){
print_r($paypal->DoExpressCheckoutPayment());
echo $_GET['OrderID'];
}
else{
}
config.php is like this
<?php
//start session in all pages
if (session_status() == PHP_SESSION_NONE) { session_start(); } //PHP >= 5.4.0
//if(session_id() == '') { session_start(); } //uncomment this line if PHP < 5.4.0 and comment out line above
// sandbox or live
define('PPL_MODE', 'sandbox');
if(PPL_MODE=='sandbox'){
define('PPL_API_USER', 'XXXXX');
define('PPL_API_PASSWORD', 'XXXXX');
define('PPL_API_SIGNATURE',
'XXXXXXXXXX');
}
else{
define('PPL_API_USER', 'XXXXX');
define('PPL_API_PASSWORD', 'XXXXX');
define('PPL_API_SIGNATURE', 'XXXXXXXXXX');
}
define('PPL_LANG', 'EN');
define('PPL_LOGO_IMG', 'http://localhost/paypal/img/logo.png');
define('PPL_RETURN_URL', 'http://localhost/paypal/process.php');
define('PPL_CANCEL_URL', 'http://localhost/paypal/cancel_url.php');
define('PPL_CURRENCY_CODE', 'EUR');
函数.php是这样的
function _GET($label='',$default='',$set_default=false){
$value=$default;
if(isset($_GET[$label])&&!empty($_GET[$label])){
$value=$_GET[$label];
}
if($set_default===true&&(!isset($_GET[$label])||$_GET[$label]=='')){
$_GET[$label]=$default;
}
return $value;
}
function _POST($label='',$default='',$set_default=false){
$value=$default;
if(isset($_POST[$label])&&!empty($_POST[$label])){
$value=$_POST[$label];
}
if($set_default===true&&(!isset($_POST[$label])||$_POST[$label]=='')){
$_POST[$label]=$default;
}
return $value;
}
function _SESSION($label='',$default='',$set_default=false){
$value=$default;
if(isset($_SESSION[$label])&&!empty($_SESSION[$label])){
$value=$_SESSION[$label];
}
if($set_default===true&&(!isset($_SESSION[$label])||$_SESSION[$label]=='')){
$_SESSION[$label]=$default;
}
return $value;
}
PayPal.class.php文件是这样的
function GetProductsTotalAmount($products){
$ProductsTotalAmount=0;
foreach($products as $p => $item){
$ProductsTotalAmount = $ProductsTotalAmount + $this -> GetItemTotalPrice($item);
}
return $ProductsTotalAmount;
}
function GetGrandTotal($products, $charges){
$GrandTotal = $this -> GetProductsTotalAmount($products);
foreach($charges as $charge){
$GrandTotal = $GrandTotal + $charge;
}
return $GrandTotal;
}
function SetExpressCheckout($products, $charges, $noshipping='1'){
$padata = '&METHOD=SetExpressCheckout';
$padata .= '&RETURNURL='.urlencode(PPL_RETURN_URL);
$padata .= '&CANCELURL='.urlencode(PPL_CANCEL_URL);
$padata .= '&PAYMENTREQUEST_0_PAYMENTACTION='.urlencode("SALE");
foreach($products as $p => $item){
$padata .= '&L_PAYMENTREQUEST_0_NAME'.$p.'='.urlencode($item['ItemName']);
$padata .= '&L_PAYMENTREQUEST_0_NUMBER'.$p.'='.urlencode($item['ItemNumber']);
$padata .= '&L_PAYMENTREQUEST_0_DESC'.$p.'='.urlencode($item['ItemDesc']);
$padata .= '&L_PAYMENTREQUEST_0_AMT'.$p.'='.urlencode($item['ItemPrice']);
$padata .= '&L_PAYMENTREQUEST_0_QTY'.$p.'='. urlencode($item['ItemQty']);
}
$padata .= '&NOSHIPPING='.$noshipping;
$padata .= '&PAYMENTREQUEST_0_ITEMAMT='.urlencode($this -> GetProductsTotalAmount($products));
$padata .= '&PAYMENTREQUEST_0_TAXAMT='.urlencode($charges['TotalTaxAmount']);
$padata .= '&PAYMENTREQUEST_0_SHIPPINGAMT='.urlencode($charges['ShippinCost']);
$padata .= '&PAYMENTREQUEST_0_HANDLINGAMT='.urlencode($charges['HandalingCost']);
$padata .= '&PAYMENTREQUEST_0_SHIPDISCAMT='.urlencode($charges['ShippinDiscount']);
$padata .= '&PAYMENTREQUEST_0_INSURANCEAMT='.urlencode($charges['InsuranceCost']);
$padata .= '&PAYMENTREQUEST_0_AMT='.urlencode($this->GetGrandTotal($products, $charges));
$padata .= '&PAYMENTREQUEST_0_CURRENCYCODE='.urlencode(PPL_CURRENCY_CODE);
$padata .= '&LOCALECODE='.PPL_LANG; //PayPal pages to match the language on your website;
$padata .= '&LOGOIMG='.PPL_LOGO_IMG; //site logo
$padata .= '&CARTBORDERCOLOR=FFFFFF'; //border color of cart
$padata .= '&ALLOWNOTE=1';
$_SESSION['ppl_products'] = $products;
$_SESSION['ppl_charges'] = $charges;
$httpParsedResponseAr = $this->PPHttpPost('SetExpressCheckout', $padata);
//Respond according to message we receive from Paypal
if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])){
$paypalmode = (PPL_MODE=='sandbox') ? '.sandbox' : '';
$paypalurl ='https://www'.$paypalmode.'.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token='.$httpParsedResponseAr["TOKEN"].'';
header('Location: '.$paypalurl);
}
else{
echo '<div style="color:red"><b>Error : </b>'.urldecode($httpParsedResponseAr["L_LONGMESSAGE0"]).'</div>';
echo '<pre>';
print_r($httpParsedResponseAr);
echo '</pre>';
}
}
function DoExpressCheckoutPayment(){
if(!empty(_SESSION('ppl_products'))&&!empty(_SESSION('ppl_charges'))){
$products=_SESSION('ppl_products');
$charges=_SESSION('ppl_charges');
$padata = '&TOKEN='.urlencode(_GET('token'));
$padata .= '&PAYERID='.urlencode(_GET('PayerID'));
$padata .= '&PAYMENTREQUEST_0_PAYMENTACTION='.urlencode("SALE");
//set item info here, otherwise we won't see product details later
foreach($products as $p => $item){
$padata .= '&L_PAYMENTREQUEST_0_NAME'.$p.'='.urlencode($item['ItemName']);
$padata .= '&L_PAYMENTREQUEST_0_NUMBER'.$p.'='.urlencode($item['ItemNumber']);
$padata .= '&L_PAYMENTREQUEST_0_DESC'.$p.'='.urlencode($item['ItemDesc']);
$padata .= '&L_PAYMENTREQUEST_0_AMT'.$p.'='.urlencode($item['ItemPrice']);
$padata .= '&L_PAYMENTREQUEST_0_QTY'.$p.'='. urlencode($item['ItemQty']);
}
$padata .= '&PAYMENTREQUEST_0_ITEMAMT='.urlencode($this -> GetProductsTotalAmount($products));
$padata .= '&PAYMENTREQUEST_0_TAXAMT='.urlencode($charges['TotalTaxAmount']);
$padata .= '&PAYMENTREQUEST_0_SHIPPINGAMT='.urlencode($charges['ShippinCost']);
$padata .= '&PAYMENTREQUEST_0_HANDLINGAMT='.urlencode($charges['HandalingCost']);
$padata .= '&PAYMENTREQUEST_0_SHIPDISCAMT='.urlencode($charges['ShippinDiscount']);
$padata .= '&PAYMENTREQUEST_0_INSURANCEAMT='.urlencode($charges['InsuranceCost']);
$padata .= '&PAYMENTREQUEST_0_AMT='.urlencode($this->GetGrandTotal($products, $charges));
$padata .= '&PAYMENTREQUEST_0_CURRENCYCODE='.urlencode(PPL_CURRENCY_CODE);
//We need to execute the "DoExpressCheckoutPayment" at this point to Receive payment from user.
$httpParsedResponseAr = $this->PPHttpPost('DoExpressCheckoutPayment', $padata);
//vdump($httpParsedResponseAr);
//Check if everything went ok..
if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])){
echo '<h2>Success</h2>';
echo 'Your Transaction ID : '.urldecode($httpParsedResponseAr["PAYMENTINFO_0_TRANSACTIONID"]);
/*
//Sometimes Payment are kept pending even when transaction is complete.
//hence we need to notify user about it and ask him manually approve the transiction
*/
if('Completed' == $httpParsedResponseAr["PAYMENTINFO_0_PAYMENTSTATUS"]){
echo '<div style="color:green">Payment Received! Your product will be sent to you very soon!</div>';
}
elseif('Pending' == $httpParsedResponseAr["PAYMENTINFO_0_PAYMENTSTATUS"]){
echo '<div style="color:red">Transaction Complete, but payment may still be pending! '.
'If that's the case, You can manually authorize this payment in your <a target="_new" href="http://www.paypal.com">Paypal Account</a></div>';
}
$this->GetTransactionDetails();
}
else{
echo '<div style="color:red"><b>Error : </b>'.urldecode($httpParsedResponseAr["L_LONGMESSAGE0"]).'</div>';
echo '<pre>';
print_r($httpParsedResponseAr);
echo '</pre>';
}
}
else{
// Request Transaction Details
$this->GetTransactionDetails();
}
}
function GetTransactionDetails(){
// we can retrive transection details using either GetTransactionDetails or GetExpressCheckoutDetails
// GetTransactionDetails requires a Transaction ID, and GetExpressCheckoutDetails requires Token returned by SetExpressCheckOut
$padata = '&TOKEN='.urlencode(_GET('token'));
$httpParsedResponseAr = $this->PPHttpPost('GetExpressCheckoutDetails', $padata, PPL_API_USER, PPL_API_PASSWORD, PPL_API_SIGNATURE, PPL_MODE);
if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])){
echo '<br /><b>Stuff to store in database :</b><br /><pre>';
echo '<pre>';
print_r($httpParsedResponseAr);
echo '</pre>';
}
else {
echo '<div style="color:red"><b>GetTransactionDetails failed:</b>'.urldecode($httpParsedResponseAr["L_LONGMESSAGE0"]).'</div>';
echo '<pre>';
print_r($httpParsedResponseAr);
echo '</pre>';
}
}
function PPHttpPost($methodName_, $nvpStr_) {
// Set up your API credentials, PayPal end point, and API version.
$API_UserName = urlencode(PPL_API_USER);
$API_Password = urlencode(PPL_API_PASSWORD);
$API_Signature = urlencode(PPL_API_SIGNATURE);
$paypalmode = (PPL_MODE=='sandbox') ? '.sandbox' : '';
$API_Endpoint = "https://api-3t".$paypalmode.".paypal.com/nvp";
$version = urlencode('109.0');
// Set the curl parameters.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $API_Endpoint);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
//curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
// Turn off the server and peer verification (TrustManager Concept).
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);
// Set the API operation, version, and API signature in the request.
$nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$API_Password&USER=$API_UserName&SIGNATURE=$API_Signature$nvpStr_";
// Set the request as a POST FIELD for curl.
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
// Get response from the server.
$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;
}
}
那么有人可以告诉我如何将user_id的值发送到PayPal并再次从PayPal中获取值。
简短而甜蜜的方法是使用 PAYMENTREQUEST_0_CUSTOM 参数在 DoExpressCheckoutPayment 请求中传递user_id值。 此参数可用于存储最多 256 个字符的数据。
如果您使用的是IPN,您将获得$ _POST['custom'],并且它将具有与您传入的相同值。 如果您使用 GetTransactionDetails 提取有关事务的详细信息,它也将可用。
另一种选择是使用 PAYMENTREQUEST_0_INVNUM 将发票 ID 传递给PayPal。 这假设您有与您的用户记录相关的某种订单/发票记录。
这样,PayPal详细信息将包括您的实际订单ID,并将在IPN,GetTransactionDetails等中返回。 使用该 ID,您可以随时提取相关的用户数据。