public static function createAddress()
 {
     $addr = new ShippingAddress();
     $addr->setLine1(self::$line1);
     $addr->setLine2(self::$line2);
     $addr->setCity(self::$city);
     $addr->setState(self::$state);
     $addr->setPostalCode(self::$postalCode);
     $addr->setCountryCode(self::$countryCode);
     $addr->setPhone(self::$phone);
     $addr->setRecipientName(self::$recipientName);
     return $addr;
 }
// Please note that the plan Id should be only set in this case.
$plan = new Plan();
$plan->setId($createdPlan->getId());
$agreement->setPlan($plan);
// Add Payer
$payer = new Payer();
$payer->setPaymentMethod('credit_card')->setPayerInfo(new PayerInfo(array('email' => '*****@*****.**')));
// Add Credit Card to Funding Instruments
$creditCard = new CreditCard();
$creditCard->setType('visa')->setNumber('4491759698858890')->setExpireMonth('12')->setExpireYear('2017')->setCvv2('128');
$fundingInstrument = new FundingInstrument();
$fundingInstrument->setCreditCard($creditCard);
$payer->setFundingInstruments(array($fundingInstrument));
//Add Payer to Agreement
$agreement->setPayer($payer);
// Add Shipping Address
$shippingAddress = new ShippingAddress();
$shippingAddress->setLine1('111 First Street')->setCity('Saratoga')->setState('CA')->setPostalCode('95070')->setCountryCode('US');
$agreement->setShippingAddress($shippingAddress);
// For Sample Purposes Only.
$request = clone $agreement;
// ### Create Agreement
try {
    // Please note that as the agreement has not yet activated, we wont be receiving the ID just yet.
    $agreement = $agreement->create($apiContext);
} catch (Exception $ex) {
    ResultPrinter::printError("Created Billing Agreement.", "Agreement", $agreement->getId(), $request, $ex);
    exit(1);
}
ResultPrinter::printResult("Created Billing Agreement.", "Agreement", $agreement->getId(), $request, $agreement);
return $agreement;
 private function createPayment($details)
 {
     $payment = new Payment();
     $payer = new Payer();
     $payer->payment_method = "paypal";
     $amount = new Amount();
     $amount->currency = $details['PAYMENTREQUEST_CURRENCYCODE'];
     $amount->total = $details['PAYMENTREQUEST_AMT'];
     $transaction = new Transaction();
     $transaction->amount = $amount;
     $transaction->description = $details['PAYMENTREQUEST_DESCRIPTION'];
     $itemList = new ItemList();
     foreach ($details['PAYMENTREQUEST_ITEMS'] as $itemInfo) {
         $item = new Item();
         $item->setQuantity($itemInfo['quantity']);
         $item->setName($itemInfo['name']);
         $item->setDescription($itemInfo['description']);
         $item->setPrice($itemInfo['price']);
         $item->setCategory($itemInfo['category']);
         $item->setCurrency($itemInfo['currency']);
         $item->setTax($itemInfo['tax']);
         $item->setSku($itemInfo['sku']);
         $itemList->addItem($item);
     }
     $addressInfo = $details['PAYMENTREQUEST_SHIPPING_ADDRESS'];
     $shippingAddress = new ShippingAddress();
     $shippingAddress->setRecipientName($addressInfo['recipient_name']);
     $shippingAddress->setLine1($addressInfo['line1']);
     $shippingAddress->setPostalCode($addressInfo['postal_code']);
     $shippingAddress->setCity($addressInfo['city']);
     $shippingAddress->setCountryCode($addressInfo['country_code']);
     $itemList->setShippingAddress($shippingAddress);
     $transaction->setItemList($itemList);
     $redirectUrls = new RedirectUrls();
     $redirectUrls->return_url = $details['RETURN_URL'];
     $redirectUrls->cancel_url = $details['CANCEL_URL'];
     $payment->intent = "sale";
     $payment->payer = $payer;
     $payment->redirect_urls = $redirectUrls;
     $payment->transactions = [$transaction];
     if (false == isset($details['response']) && false == isset($details['response']['state']) && isset($payment->payer->payment_method) && 'paypal' == $payment->payer->payment_method) {
         $paymentResponse = $payment->create($this->api);
         $details->replace(['response' => $paymentResponse->toArray()]);
         foreach ($paymentResponse->links as $link) {
             if ($link->rel == 'approval_url') {
                 $details->replace(['approval_url' => $link->href]);
             }
         }
     }
 }
 /**
  * @return Transaction
  */
 private function buildTransaction()
 {
     $clientInfo = ClientHelper::getClientInfo();
     $priceIncludesTax = $clientInfo->business_settings->tax->price_includes_tax;
     $paypalItems = [];
     $subTotal = 0;
     foreach ($this->order->getItems() as $item) {
         /* @var $item OrderItem */
         // don't add shipping row
         if ($item->isShipping()) {
             continue;
         }
         $subTotal += $item->getPrice();
         $newItem = new Item();
         $newItem->setName($item->getProductName())->setCurrency($clientInfo->currency->currency_iso)->setQuantity($item->getQuantity())->setSku($item->getProductSku())->setPrice($item->getPrice() / 100);
         $paypalItems[] = $newItem;
     }
     $shippingBeforeTax = $this->order->getShipping() / 100;
     $tax = $this->order->getTax() / 100;
     $subTotal = $subTotal / 100;
     $total = $this->order->getTotalPrice() / 100;
     $orderShippingAddress = $this->order->getShippingAddress()->getArray();
     $shippingAddress = new ShippingAddress();
     $shippingAddress->setCity($orderShippingAddress['city']);
     $shippingAddress->setCountryCode(CountryHelper::getCountryCode($orderShippingAddress['countryId']));
     $shippingAddress->setPostalCode($orderShippingAddress['postcode']);
     $shippingAddress->setLine1($orderShippingAddress['address1']);
     $shippingAddress->setState($orderShippingAddress['state']);
     $shippingAddress->setRecipientName($this->order->getCustomer()->fullName());
     $itemList = new ItemList();
     if (!$priceIncludesTax) {
         $itemList->setItems($paypalItems);
     }
     $itemList->setShippingAddress($shippingAddress);
     $details = new Details();
     $details->setShipping($shippingBeforeTax)->setTax($tax)->setSubtotal($subTotal);
     $amount = new Amount();
     $amount->setCurrency($clientInfo->currency->currency_iso)->setTotal($total)->setDetails($details);
     $transaction = new Transaction();
     $transaction->setAmount($amount)->setItemList($itemList)->setDescription("Order from " . $clientInfo->name)->setInvoiceNumber($this->order->getId());
     return $transaction;
 }
 public function postPayment(Request $request)
 {
     $payer = new Payer();
     $payer->setPaymentMethod('paypal');
     $item_listArr = [];
     $totalAmount = 0;
     if ($request->session()->has('member')) {
         $memberID = $request->session()->get('member');
         $memberInfo = DB::select("select * from members where email = '{$memberID}'")[0];
         $shoppingCart = DB::select("select * from shopping_cart where member_id = '{$memberID}'")[0]->shopping_cart;
         $shoppingCart = json_decode($shoppingCart, true);
         if (sizeof($shoppingCart) == 0) {
             return Redirect::to('/shoppingCart');
         }
         $shoppingCartItemsFinal = DB::table('products')->whereIn('product_id', array_keys($shoppingCart))->get();
         foreach ($shoppingCartItemsFinal as $key => $value) {
             $value->num = $shoppingCart[$value->product_id];
             $priceList = json_decode($value->price, true);
             $eachPrice = $value->single_price;
             krsort($priceList);
             foreach ($priceList as $packageNum => $price) {
                 if ($value->num >= $packageNum) {
                     $eachPrice = $price;
                     break;
                 }
             }
             $value->eachPrice = $eachPrice;
             $item = new Item();
             $item->setName($value->name)->setCurrency('AUD')->setQuantity($value->num * 1)->setPrice($eachPrice);
             // unit price
             array_push($item_listArr, $item);
             $totalAmount += $eachPrice * $value->num;
         }
     } else {
         $shoppingCart = json_decode($request->cookie('shoppingCart'), true);
         if (sizeof($shoppingCart) == 0) {
             return Redirect::to('/shoppingCart');
         }
         $shoppingCartItemsFinal = DB::table('products')->whereIn('product_id', array_keys($shoppingCart))->get();
         foreach ($shoppingCartItemsFinal as $key => $value) {
             $value->num = $shoppingCart[$value->product_id];
             $priceList = json_decode($value->price, true);
             $eachPrice = $value->single_price;
             krsort($priceList);
             foreach ($priceList as $packageNum => $price) {
                 if ($value->num >= $packageNum) {
                     $eachPrice = $price;
                     break;
                 }
             }
             $value->eachPrice = $eachPrice;
             $item = new Item();
             $item->setName($value->name)->setCurrency('AUD')->setQuantity($value->num * 1)->setPrice($eachPrice);
             // unit price
             array_push($item_listArr, $item);
             $totalAmount += $eachPrice * $value->num;
         }
     }
     $item_list = new ItemList();
     $item_list->setItems($item_listArr);
     $shipping_address = new ShippingAddress();
     $payerInfo = Session::get('payment_shopping_payer_info');
     $shipping_address->setCountryCode('AU');
     $shipping_address->setCity($payerInfo['suburb']);
     $shipping_address->setPostalCode($payerInfo['postcode']);
     $shipping_address->setLine1($payerInfo['address']);
     $shipping_address->setState($payerInfo['state']);
     $shipping_address->setRecipientName($payerInfo['name']);
     $item_list->setShippingAddress($shipping_address);
     $amount = new Amount();
     $amount->setCurrency('AUD')->setTotal($totalAmount);
     $transaction = new Transaction();
     $transaction->setAmount($amount)->setItemList($item_list)->setDescription('Your transaction description');
     $redirect_urls = new RedirectUrls();
     $redirect_urls->setReturnUrl(URL::route('payment.status'))->setCancelUrl(URL::route('payment.status'));
     $payment = new Payment();
     $payment->setIntent('Sale')->setPayer($payer)->setRedirectUrls($redirect_urls)->setTransactions(array($transaction));
     try {
         $payment->create($this->_api_context);
     } catch (\PayPal\Exception\PPConnectionException $ex) {
         if (\Config::get('app.debug')) {
             echo "Exception: " . $ex->getMessage() . PHP_EOL;
             $err_data = json_decode($ex->getData(), true);
             exit;
         } else {
             die('Some error occur, sorry for inconvenient');
         }
     }
     foreach ($payment->getLinks() as $link) {
         if ($link->getRel() == 'approval_url') {
             $redirect_url = $link->getHref();
             break;
         }
     }
     // add payment ID to session
     Session::put('paypal_payment_id', $payment->getId());
     if (isset($redirect_url)) {
         // redirect to paypal
         return Redirect::away($redirect_url);
     } else {
         return Redirect::to('/check-out');
         // return Redirect::route('original.route')->with('error', 'Unknown error occurred');
     }
 }
 function generateShippingAddress($addressee, $address)
 {
     $address = new ShippingAddress();
     $address->setRecipientName($addressee);
     $address->setLine1($address->line1);
     $address->setLine2($address->line2);
     $address->setCity($address->city);
     $address->setState($address->province->name);
     $address->setCountryCode($address->country->name);
     $address->setPostalCode($address->zip);
     return $address;
 }