2017-10-15 28 views
1

我已經設法將PayPal快速結賬整合到我的電子商務商店中,然後瀏覽並遵循教程,所有工作都很好,直到我真正嘗試付費。其返回以下錯誤:php PayPal在TotalAmount結帳錯誤

警告:行用於/home2/joso157/public_html/jssite/shop/paypal-express-checkout/index.php 的foreach()提供參數無效139

錯誤:的OrderTotal(AMT):缺少所需參數

任何一個知道如何解決這一問題?在此先感謝

<?php 
session_start(); 
include_once("../config.php"); 
include_once("paypal.class.php"); 

$paypalmode = ($PayPalMode=='') ? '' : ''; 

if(isset($_SESSION["cart_products"])) 
{ 

$paypal_data =''; 
$ItemTotalPrice = 0; 
$productWght = "0"; 
$i = 0; 
    foreach ($_SESSION["cart_products"] as $cart_itm) 
    { 
    $product_code = filter_var($cart_itm["product_code"], FILTER_SANITIZE_STRING); 

    $results = $mysqli->query("SELECT product_name, product_desc, price_1, price_2, price_3, price_4, weight_1, weight_2, weight_3, weight_4 FROM products INNER JOIN weight ON (products.weight = weight.id) WHERE product_code='$product_code' LIMIT 1"); 
    $obj = $results->fetch_object(); 

    $paypal_data .= '&L_PAYMENTREQUEST_0_NAME'.$i.'='.urlencode($obj->product_name); 
    $paypal_data .= '&L_PAYMENTREQUEST_0_NUMBER'.$i.'='.urlencode($cart_itm["product_code"]); 
    $paypal_data .= '&L_PAYMENTREQUEST_0_AMT'.$i.'='.urlencode($cart_itm["price"]);  
    $paypal_data .= '&L_PAYMENTREQUEST_0_QTY'.$i.'='. urlencode($cart_itm["product_qty"]); 
    $paypal_data .= '&L_PAYMENTREQUEST_0_WEIGHT'.$i.'='. urlencode($cart_itm["weight"]);  

    $subtotal = ($cart_itm["price"]*$cart_itm["product_qty"]); 

    $ItemTotalPrice = $ItemTotalPrice + $subtotal; 

    $paypal_product['items'][] = array('itm_name'=>$obj->product_name, 
             'itm_price'=>$cart_itm["price"], 
             'itm_code'=>$cart_itm["product_code"], 
             'itm_qty'=>$cart_itm["product_qty"], 
             ); 
    $productWght += $cart_itm["product_qty"]*$cart_itm["weight"]; 

    $i++; 
} 
$k = $i; 
$total_tax = 0; 
foreach($taxes as $key => $value){ 
     $tax_amount  = round($ItemTotalPrice * ($value/100)); 
     $tax_item[$key] = $tax_amount; 
     $total_tax = $total_tax + $tax_amount; 
} 

$product_weight = ($product_qty*$cart_itm["weight"]); 
$total_weight += $product_weight; 
$total_weight = $productWght; 

$shipping_cost = '0'; 
if($total_weight <= '1.9'){ 
    $shipping_cost = "2.95"; 
}elseif(($total_weight >= '1.9') && ($total_weight <= '11')){ 
    $shipping_cost = "5.95"; 
}elseif(($total_weight >= '11') && ($total_weight <= '30')){ 
    $shipping_cost = "9.95"; 
}elseif(($total_weight >= '30') && ($total_weight <= '100')){ 
    $shipping_cost = "24.95"; 

} 

$GrandTotal = ($ItemTotalPrice + $total_tax + $HandalingCost + $InsuranceCost + $shipping_cost); 

$discount = '0'; 
if(isset($_SESSION['discount_amount']) && !empty($_SESSION['discount_amount'])) 
{ 
     $GrandTotal = $GrandTotal - $_SESSION['discount_amount']; 
     $GrandTotal = sprintf("%01.2f", $GrandTotal); 
     $discount = ($_SESSION['discount_amount'] != '0') ? "-".$_SESSION['discount_amount'] : "0"; 
} 

$paypal_product['assets'] = array('tax_total'=>$total_tax, 
          'handaling_cost'=>$HandalingCost, 
          'insurance_cost'=>$InsuranceCost, 
          'shippin_cost'=>$shipping_cost, 
          'discount'=>$discount, 
          'grand_total'=>$GrandTotal); 

$_SESSION["paypal_products"] = $paypal_product; 


/*$paypal_data .= "&L_PAYMENTREQUEST_0_NAME".$k."=Discount&L_PAYMENTREQUEST_0_NUMBER".$k."=1&L_PAYMENTREQUEST_0_AMT".$k."=".$discount."&L_PAYMENTREQUEST_0_QTY".$k."=1&L_PAYMENTREQUEST_0_WEIGHT".$k."=0";*/ 

$padata = '&METHOD=SetExpressCheckout'. 
      '&RETURNURL='.urlencode($PayPalReturnURL). 
      '&CANCELURL='.urlencode($PayPalCancelURL). 
      '&PAYMENTREQUEST_0_PAYMENTACTION='.urlencode("SALE"). 
      $paypal_data.    
      '&NOSHIPPING=0'. 
      '&PAYMENTREQUEST_0_ITEMAMT='.urlencode($ItemTotalPrice). 
      '&PAYMENTREQUEST_0_TAXAMT='.urlencode($total_tax). 
      '&PAYMENTREQUEST_0_SHIPPINGAMT='.urlencode($shipping_cost). 
      '&PAYMENTREQUEST_0_HANDLINGAMT='.urlencode($HandalingCost). 
      '&PAYMENTREQUEST_0_SHIPDISCAMT='.urlencode($discount). 
      '&PAYMENTREQUEST_0_INSURANCEAMT='.urlencode($InsuranceCost). 
      '&PAYMENTREQUEST_0_AMT='.urlencode($GrandTotal). 
      '&PAYMENTREQUEST_0_CURRENCYCODE='.urlencode($PayPalCurrencyCode). 
      '&LOCALECODE=GB'. 
      '&LOGOIMG=http://www.sanwebe.com/wp-content/themes/sanwebe/img/logo.png'. 
      '&CARTBORDERCOLOR=FFFFFF'. 
      '&ALLOWNOTE=1'; 


    $paypal= new MyPayPal(); 
    $httpParsedResponseAr = $paypal->PPHttpPost('SetExpressCheckout', $padata, $PayPalApiUsername, $PayPalApiPassword, $PayPalApiSignature, $PayPalMode); 


    if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])) 
    { 
      unset($_SESSION["cart_products"]); 

      $paypalurl ='https://www.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>'; 
    } 

} 

if(isset($_GET["token"]) && isset($_GET["PayerID"])) 
{ 

$token = $_GET["token"]; 
$payer_id = $_GET["PayerID"]; 

$paypal_product = $_SESSION["paypal_products"]; 
$paypal_data = ''; 
$ItemTotalPrice = 0; 
    $z = '0'; 
foreach($paypal_product['items'] as $key=>$p_item) 
{  
    $paypal_data .= '&L_PAYMENTREQUEST_0_QTY'.$key.'='. urlencode($p_item['itm_qty']); 
    $paypal_data .= '&L_PAYMENTREQUEST_0_AMT'.$key.'='.urlencode($p_item['itm_price']); 
    $paypal_data .= '&L_PAYMENTREQUEST_0_NAME'.$key.'='.urlencode($p_item['itm_name']); 
    $paypal_data .= '&L_PAYMENTREQUEST_0_NUMBER'.$key.'='.urlencode($p_item['itm_code']); 

    $subtotal = ($p_item['itm_price']*$p_item['itm_qty']); 
    $ItemTotalPrice = ($ItemTotalPrice + $subtotal); 

    $z = $key; 
} 
/*$z = $z+1; 
$paypal_data .= '&L_PAYMENTREQUEST_0_QTY'.$z.'='. urlencode("1"); 
$paypal_data .= '&L_PAYMENTREQUEST_0_AMT'.$z.'='.urlencode($discount); 
$paypal_data .= '&L_PAYMENTREQUEST_0_NAME'.$z.'='.urlencode("Discount Amount"); 
$paypal_data .= '&L_PAYMENTREQUEST_0_NUMBER'.$z.'='.urlencode('1');*/ 

$padata = '&TOKEN='.urlencode($token). 
      '&PAYERID='.urlencode($payer_id). 
      '&PAYMENTREQUEST_0_PAYMENTACTION='.urlencode("SALE"). 
      $paypal_data. 
      '&PAYMENTREQUEST_0_ITEMAMT='.urlencode($ItemTotalPrice). 
      '&PAYMENTREQUEST_0_TAXAMT='.urlencode($paypal_product['assets']['tax_total']). 
      '&PAYMENTREQUEST_0_SHIPPINGAMT='.urlencode($paypal_product['assets']['shippin_cost']). 
      '&PAYMENTREQUEST_0_HANDLINGAMT='.urlencode($paypal_product['assets']['handaling_cost']). 
      '&PAYMENTREQUEST_0_SHIPDISCAMT='.urlencode($paypal_product['assets']['discount']). 
      '&PAYMENTREQUEST_0_INSURANCEAMT='.urlencode($paypal_product['assets']['insurance_cost']). 
      '&PAYMENTREQUEST_0_AMT='.urlencode($paypal_product['assets']['grand_total']). 
      '&PAYMENTREQUEST_0_CURRENCYCODE='.urlencode($PayPalCurrencyCode); 

$paypal= new MyPayPal(); 
$httpParsedResponseAr = $paypal->PPHttpPost('DoExpressCheckoutPayment', $padata, $PayPalApiUsername, $PayPalApiPassword, $PayPalApiSignature, $PayPalMode); 

if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])) 
{ 

     echo '<h2>Success</h2>'; 
     echo 'Your Transaction ID : '.urldecode($httpParsedResponseAr["PAYMENTINFO_0_TRANSACTIONID"]); 

      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 is still pending! '. 
       'You need to manually authorize this payment in your <a target="_new" href="http://www.paypal.com">Paypal Account</a></div>'; 
      } 

      $padata = '&TOKEN='.urlencode($token); 
      $paypal= new MyPayPal(); 
      $httpParsedResponseAr = $paypal->PPHttpPost('GetExpressCheckoutDetails', $padata, $PayPalApiUsername, $PayPalApiPassword, $PayPalApiSignature, $PayPalMode); 

      if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])) 
      { 

       echo '<br /><b>Stuff to store in database :</b><br />'; 

       echo '<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>'; 

      } 

}else{ 
     echo '<div style="color:red"><b>Error : </b>'.urldecode($httpParsedResponseAr["L_LONGMESSAGE0"]).'</div>'; 
     echo '<pre>'; 
     print_r($httpParsedResponseAr); 
     echo '</pre>'; 
} 
} 
?> 

回答

0

基於您的代碼,錯誤是在這裏:

$paypal_product = $_SESSION["paypal_products"]; 
$paypal_data = ''; 
$ItemTotalPrice = 0; 
    $z = '0'; 
foreach($paypal_product['items'] as $key=>$p_item) 
{  
    $paypal_data .= '&L_PAYMENTREQUEST_0_QTY'.$key.'='. urlencode($p_item['itm_qty']); 
    $paypal_data .= '&L_PAYMENTREQUEST_0_AMT'.$key.'='.urlencode($p_item['itm_price']); 
    $paypal_data .= '&L_PAYMENTREQUEST_0_NAME'.$key.'='.urlencode($p_item['itm_name']); 
    $paypal_data .= '&L_PAYMENTREQUEST_0_NUMBER'.$key.'='.urlencode($p_item['itm_code']); 

    $subtotal = ($p_item['itm_price']*$p_item['itm_qty']); 
    $ItemTotalPrice = ($ItemTotalPrice + $subtotal); 

    $z = $key; 
} 

的錯誤表示$paypal_product['items'],這是傳遞給foreach()不是一個數組。這可能意味着會話數據爲空或者不包含您所期望的細節。

這似乎是在這裏填入:

$paypal_product['items'][] = array('itm_name'=>$obj->product_name, 
            'itm_price'=>$cart_itm["price"], 
            'itm_code'=>$cart_itm["product_code"], 
            'itm_qty'=>$cart_itm["product_qty"], 
            ); 

如果我們創建這個數據的一個例子,它可能看起來像:

$paypal_product['items'] = array(
    0 => array(
    'itm_name'=>"Product 1", 
    'itm_price'=>123.45, 
    'itm_code'=>6789, 
    'itm_qty'=>1 
), 
    1 => array(
    'itm_name'=>"Product 2", 
    'itm_price'=>9.87, 
    'itm_code'=>6790, 
    'itm_qty'=>100 
) 
); 

這隨後被傳遞給這裏的會話:

$_SESSION["paypal_products"] = $paypal_product; 

我會建議$paypal_product['items']正在填充正確。在使用count()以確保至少有一個數組元素後,您可以檢查它。