如何在Codeigniter中获得用于Paypal付款的购物车值

时间:2018-12-18 21:08:50

标签: php codeigniter paypal frameworks

我也表示歉意,我知道我的代码确实很丑陋,即使这是一种不好的做法,我也该如何获取购物车中的值,我真的不明白。我是整合Paypal付款的新手

贝宝控制器

  <?php if (!defined('BASEPATH')) exit('No direct script access 
  allowed');

  require_once(APPPATH . 'libraries/paypal-php-sdk/paypal/rest-api-sdk- 
  php/sample/bootstrap.php'); // require paypal files


  use PayPal\Api\ItemList;
  use PayPal\Api\Payment;
  use PayPal\Api\RedirectUrls;
  use PayPal\Api\Amount;
  use PayPal\Api\PaymentExecution;
  use PayPal\Api\RefundRequest;
  use PayPal\Api\Sale;

 class Paypal extends CI_Controller
 {
 public $_api_context;

 function  __construct()
  {
    parent::__construct();
    $this->load->model('paypal_model', 'paypal');
    // paypal credentials
    $this->config->load('paypal');

    $this->_api_context = new \PayPal\Rest\ApiContext(
        new \PayPal\Auth\OAuthTokenCredential(
            $this->config->item('client_id'), $this->config- 
    >item('secret')
        )
    );
   }

 function index(){
    $this->load->view('content/payment_credit_form');
}


 function create_payment_with_paypal()
  {

    // setup PayPal api context
    $this->_api_context->setConfig($this->config->item('settings'));


  // ### Payer
 // A resource representing a Payer that funds a payment
 // For direct credit card payments, set payment method
 // to 'credit_card' and add an array of funding instruments.

    $payer['payment_method'] = 'paypal';

    // ### Itemized information
    // (Optional) Lets you specify item wise
  // information
    $item1["name"] = $this->input->post('item_name');
    $item1["sku"] = $this->input->post('item_number');  // Similar to 
   `item_number` in Classic API
    $item1["description"] = $this->input->post('item_description');
    $item1["currency"] ="USD";
    $item1["quantity"] =1;
    $item1["price"] = $this->input->post('item_price');

    $itemList = new ItemList();
    $itemList->setItems(array($item1));

     // ### Additional payment details
     // Use this optional field to set additional
     // payment information such as tax, shipping
    // charges etc.
    $details['tax'] = $this->input->post('details_tax');
    $details['subtotal'] = $this->input->post('details_subtotal');
    // ### Amount
    // Lets you specify a payment amount.
    // You can also specify additional details
    // such as shipping, tax.
    $amount['currency'] = "USD";
    $amount['total'] = $details['tax'] + $details['subtotal'];
    $amount['details'] = $details;
     // ### Transaction
    // A transaction defines the contract of a
     // payment - what is the payment for and who
    // is fulfilling it.
    $transaction['description'] ='Payment description';
    $transaction['amount'] = $amount;
    $transaction['invoice_number'] = uniqid();
    $transaction['item_list'] = $itemList;

    // ### Redirect urls
    // Set the urls that the buyer must be redirected to after
    // payment approval/ cancellation.
    $baseUrl = base_url();
    $redirectUrls = new RedirectUrls();
    $redirectUrls->setReturnUrl($baseUrl."paypal/getPaymentStatus")
        ->setCancelUrl($baseUrl."paypal/getPaymentStatus");

    // ### Payment
    // A Payment Resource; create one using
     // the above types and intent set to sale 'sale'
    $payment = new Payment();
    $payment->setIntent("sale")
        ->setPayer($payer)
        ->setRedirectUrls($redirectUrls)
        ->setTransactions(array($transaction));

    try {
        $payment->create($this->_api_context);
    } catch (Exception $ex) {
        // NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL 
     CODE. FOR SAMPLE ONLY
        ResultPrinter::printError("Created Payment Using PayPal. Please 
      visit the URL to Approve.", "Payment", null, $ex);
        exit(1);
    }
    foreach($payment->getLinks() as $link) {
        if($link->getRel() == 'approval_url') {
            $redirect_url = $link->getHref();
            break;
        }
     }

    if(isset($redirect_url)) {
        /** redirect to paypal **/
        redirect($redirect_url);
    }

    $this->session->set_flashdata('success_msg','Unknown error 
    occurred');
    redirect('paypal/index');

    }


    public function getPaymentStatus()
    {

    // paypal credentials

    /** Get the payment ID before session clear **/
    $payment_id = $this->input->get("paymentId") ;
    $PayerID = $this->input->get("PayerID") ;
    $token = $this->input->get("token") ;
    /** clear the session payment ID **/

    if (empty($PayerID) || empty($token)) {
        $this->session->set_flashdata('success_msg','Payment failed');
        redirect('paypal/index');
    }

    $payment = Payment::get($payment_id,$this->_api_context);


    /** PaymentExecution object includes information necessary **/
    /** to execute a PayPal account payment. **/
    /** The payer_id is added to the request query parameters **/
    /** when the user is redirected from paypal back to your site **/
    $execution = new PaymentExecution();
    $execution->setPayerId($this->input->get('PayerID'));

    /**Execute the payment **/
    $result = $payment->execute($execution,$this->_api_context);



    //  DEBUG RESULT, remove it later **/
    if ($result->getState() == 'approved') {
        $trans = $result->getTransactions();

        // item info
        $Subtotal = $trans[0]->getAmount()->getDetails()- 
     >getSubtotal();
        $Tax = $trans[0]->getAmount()->getDetails()->getTax();

        $payer = $result->getPayer();
        // payer info //
        $PaymentMethod =$payer->getPaymentMethod();
        $PayerStatus =$payer->getStatus();
        $PayerMail =$payer->getPayerInfo()->getEmail();

        $relatedResources = $trans[0]->getRelatedResources();
        $sale = $relatedResources[0]->getSale();
        // sale info //
        $saleId = $sale->getId();
        $CreateTime = $sale->getCreateTime();
        $UpdateTime = $sale->getUpdateTime();
        $State = $sale->getState();
        $Total = $sale->getAmount()->getTotal();
        /** it's all right **/
        /** Here Write your database logic like that insert record or 
        value in database if you want **/
        $this->paypal- 

      >create($Total,$Subtotal,$Tax,$PaymentMethod,
      $PayerStatus,$PayerMail,$saleI 
         d,$CreateTime,$UpdateTime,$State);
        $this->session->set_flashdata('success_msg','Payment success');
        redirect('paypal/success');
    }
    $this->session->set_flashdata('success_msg','Payment failed');
    redirect('paypal/cancel');
   }
   function success(){
    $this->load->view("content/success");
  }
  function cancel(){
    $this->load->view("content/cancel");
   }

   function load_refund_form(){
    $this->load->view('content/Refund_payment_form');
    }

     function refund_payment(){
    $refund_amount = $this->input->post('refund_amount');
    $saleId = $this->input->post('sale_id');
    $paymentValue =  (string) round($refund_amount,2); ;

       // ### Refund amount
      // and refunded fee (to Payee). Use the $amt->details
     // field to mention fees refund details.
    $amt = new Amount();
    $amt->setCurrency('USD')
        ->setTotal($paymentValue);

     // ### Refund object
     $refundRequest = new RefundRequest();
     $refundRequest->setAmount($amt);

      // ###Sale
      // A sale transaction.
      // Create a Sale object with the
     // given sale transaction id.
    $sale = new Sale();
    $sale->setId($saleId);
    try {
        // Refund the sale
        // (See bootstrap.php for more on `ApiContext`)
        $refundedSale = $sale->refundSale($refundRequest, $this- 
         >_api_context);
        } catch (Exception $ex) {
        // NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL 
        CODE. FOR SAMPLE ONLY
        ResultPrinter::printError("Refund Sale", "Sale", null, 
        $refundRequest, $ex);
        exit(1);
      }


    ResultPrinter::printResult("Refund Sale", "Sale", $refundedSale- 
     >getId(), $refundRequest, $refundedSale);

    return $refundedSale;
      }
       }

购物车控制器

<?php

defined('BASEPATH')或exit('不允许直接脚本访问');

   class Shopping_cart extends CI_Controller {


  function index()
  {

   $this->load->model("shopping_cart_model");
   $data["product"] = $this->shopping_cart_model->fetch_all();
  $data["daterange"] = $this- 
  >getDatesFromRange($_SESSION["profile_data"] 
  ['startdate'],$_SESSION["profile_data"]['enddate']);
   $this->load->library('cart');
   $this->load->view("shopping_cart", $data);


   if (isset($_POST['submitbtn'])){
   foreach($this->cart->contents() as $items)
    {
    $status = "ON-GOING";    
    $data = array(

    "product_name"   => $items["name"],
    "quantity"       => $items["qty"],
    "product_price"  => $items["price"],
    "username" => $_SESSION["profile_data"]["username"],
    'mobilenum' => $_SESSION["profile_data"]['mobilenum'],
    'homeadd' => $_SESSION["profile_data"]['homeadd'],
    'startdate' => $_SESSION["profile_data"]['startdate'],
    'enddate' => $_SESSION["profile_data"]['enddate'],
    'place_type' => $_SESSION["profile_data"]['place_type'],
    'time' => $_SESSION["profile_data"]['time'],
    'status' => $status,
    'total' => $items["subtotal"],


  );
  $this->db->insert('occasion', $data);
  $this->session->set_flashdata("success", "You successfully been 
  reserved");
   redirect("shopping_cart","refresh");

    }

    }       


   }

  function add()
  {
  $this->load->library("cart");
   $data = array(
   "id"  => $_POST["product_id"],
   "name"  => $_POST["product_name"],
    "qty"  => $_POST["quantity"],
   "price"  => $_POST["product_price"],
   "place_type" => $_SESSION["profile_data"]['place_type']

  );
 $this->cart->insert($data); //return rowid 
 echo $this->view();
  }

 function load()
  {
 echo $this->view();
  }

 function remove()
  {
  $this->load->library("cart");
 $row_id = $_POST["row_id"];
   $data = array(
  'rowid'  => $row_id,
  'qty'  => 0
   );
$this->cart->update($data);
   echo $this->view();
   }

 function clear()
  {
 $this->load->library("cart");
  $this->cart->destroy();
  echo $this->view();
  }

 function getDatesFromRange($start, $end, $format='Y-m-d') {
    return array_map(function($timestamp) use($format) {
        return date($format, $timestamp);
    },
    range(strtotime($start) + ($start < $end ? 4000 : 8000), 
    strtotime($end) + ($start < $end ? 8000 : 4000), 86400));
 }

function view()
 {
 $this->load->library("cart");
 $output = '';
 $output .= '
<h3>Rental Carts</h3><br />
 <div class="table-responsive">
 <div align="right">
<button type="button" id="clear_cart" class="btn btn-warning">Clear 
 Cart</button>
 </div>
  <br />
  <table class="table table-bordered">
 <tr>
 <th width="40%">Name</th>
 <th width="15%">Quantity</th>
 <th width="15%">Price</th>
 <th width="15%">Total</th>
 <th width="15%">Action</th>
 </tr>

 ';
  $count = 0;
 foreach($this->cart->contents() as $items)
  {
 $count++;
  $output .='

<tr> 
<td>'.$items["name"].' <input type="hidden" id="cart_name" 
name="cart_name" value="'.$items["name"].'" /></td>
<td>'.$items["qty"].' <input type="hidden" id="cart_qty" 
 name="cart_qty" value="'.$items["qty"].'" /></td>
<td>'.$items["price"].' <input type="hidden" id="cart_price" 
 name="cart_price" value="'.$items["price"].'" /></td>
<td>'.$items["subtotal"].'</td> 

<td><button type="button" name="remove" class="btn btn-danger btn-xs 
 remove_inventory" id="'.$items["rowid"].'">Remove</button></td>
   </tr>
   ';
  }
   $output .= '
    <tr>
   <td colspan="4" align="right">Total</td>
   <td>'.$this->cart->total().'</td>
  </tr>
  </table>

   </div>
   ';

  if($count == 0)
   {
   $output = '<h3 align="center">Cart is Empty</h3>';

   }
    return $output;
     }
     }

ShoppingCartView

 <h3 align="center">AOZ RESERVATION PRODUCTS RENTALS</h3>

<?php if (isset($_SESSION['success'])) { ?>
    <div class="alert alert-success"> <?php echo $_SESSION['success']; 
   ?></div>
<?php  } ?>

<form action="" method="POST">

<?php
    $numItems = count($product);
    $i = 0;
    foreach($product as $row) {
    $i++;
     ?>

    <div class="container">
        <div class="row">
           <div class="col-md-4 col-xs-12">
            <img src="<?php echo base_url().'images/'.$row- 
             >product_image; ?>"
                 class="img-thumbnail" 
                 alt="<?php echo $row->product_name; ?>"
                 style="max-width: 300px;" />
        </div>
        <div class="col-md-8 col-xs-12">
            <h4><?php echo $row->product_name; ?></h4>
            <p>Description:&nbsp<?php echo $row->description; ?></p>


            <h3 class="text-danger"><?php echo $row->product_price; ?> 
            PHP</h3>

            <input type="text" name="quantity" class="form-control 
          quantity" id="<?php echo $row->product_id; ?>" /><br />

            <input type="button" name="add_cart" 
                    class="btn btn-success add_cart" 
                    data-productname="<?php echo $row->product_name; ? 
                >" 
                    data-price="<?php echo $row->product_price; ?>" 
                    data-productid="<?php echo  $row->product_id; ?>" 
                    value="Add to Reserve"
            />
         </div>
      </div>
    </div>

   <?php if($i != $numItems){ ?>
      <hr style="width: 80%;" />
    <?php } ?>



   <?php } ?>   

   <div class="col-lg-6 col-md-6">
    <div id="cart_details">
        <h3 align="center">Cart is Empty</h3>
    </div>
    <button id="submitbtn" name="submitbtn" style="display:none;" 
  class="btn btn-success">Submit</button>
   </div>    

   </form>    

<script src="<?php echo base_url().'assests/jquery/jquery- 
  3.1.0.min.js'; ?>"></script>
<script src="<?php echo 
 base_url().'assests/bootstrap/js/bootstrap.min.js'; ?>"></script>

 </body>
</html>
 <script>
 $(document).ready(function(){

  $('.add_cart').click(function(){
  var product_id = $(this).data("productid");
  var product_name = $(this).data("productname");
  var product_price = $(this).data("price");
  var daterange = <?php echo json_encode(count($daterange));?>;
   var quantity = $('#' + product_id).val();
  if(quantity != '' && quantity > 0)
  {
  $.ajax({
  url:"<?php echo base_url(); ?>index.php/shopping_cart/add",
   method:"POST",
 data:{product_id:product_id, product_name:product_name, 
  product_price:product_price * daterange, quantity:quantity},
   success:function(data)
   {
   // alert("Product Added into Cart");
   $('#cart_details').html(data);
   $('#' + product_id).val('');
   $("#submitbtn").css("display", "block");
   }
   });
  }
  else
  {
  alert("Please Enter quantity");
 }
  });

 $('#cart_details').load("<?php echo base_url(); ? 
>index.php/shopping_cart/load");

 $(document).on('click', '.remove_inventory', function(){
 var row_id = $(this).attr("id");
  if(confirm("Are you sure you want to remove this?"))
  {
  $.ajax({
  url:"<?php echo base_url(); ?>index.php/shopping_cart/remove",
   method:"POST",
   data:{row_id:row_id},
  success:function(data)
  {
 alert("Product removed from Cart");
 $('#cart_details').html(data);
  }
  });
 }
 else
 {
 return false;
  }
  });

 $(document).on('click', '#clear_cart', function(){
  if(confirm("Are you sure you want to clear cart?"))
   {
  $.ajax({
    url:"<?php echo base_url(); ?>index.php/shopping_cart/clear",
     success:function(data)
     {
      alert("Your cart has been clear...");
     $('#cart_details').html(data);
      }
       });
        }
    else
       {
    return false;
        }
    });

       });
    </script>

1 个答案:

答案 0 :(得分:0)

好像您在这里使用PayPal Payments Standard一样,这意味着您需要为订单项添加individual item variables

这对您来说应该很好,但是如果您希望通过集成获得更大的自由度和灵活性,则可以改用Checkout API,而不要使用PayPal Standard。

我们有一个PHP SDK for PayPal,它使这一过程变得非常简单。您可以使用Composer将其安装到CodeIgniter中,其中包括PayPal提供的每个API调用的示例和模板脚本。您只需为正在处理的任何呼叫填写值,其余的工作就会完成。