/** * Convert order to array for SetExpressCheckout * * @param \XLite\Model\Order $order Order * * @return array * @see https://developer.paypal.com/docs/classic/api/merchant/SetExpressCheckout_API_Operation_NVP/ */ public function convertSetExpressCheckoutParams($order) { /** @var \XLite\Model\Currency $currency */ $currency = $order->getCurrency(); $orderTotal = $currency->roundValue($order->getTotal()); $shippingCost = $this->getShippingCost($order); /** @var \XLite\Module\CDev\Paypal\Model\Payment\Processor\ExpressCheckoutMerchantAPI $processor */ $processor = $this->getProcessor(); $params = array('RETURNURL' => $processor->getPaymentReturnUrl(), 'CANCELURL' => $processor->getPaymentCancelUrl(), 'NOSHIPPING' => null === $shippingCost ? '1' : '0', 'ALLOWNOTE' => 1, 'PAYMENTREQUEST_0_AMT' => $orderTotal, 'PAYMENTREQUEST_0_PAYMENTACTION' => $this->getPaymentAction(), 'PAYMENTREQUEST_0_CURRENCYCODE' => $currency->getCode(), 'PAYMENTREQUEST_0_HANDLINGAMT' => 0, 'PAYMENTREQUEST_0_INSURANCEAMT' => 0, 'PAYMENTREQUEST_0_SHIPPINGAMT' => (double) $shippingCost); if (\XLite\Core\Config::getInstance()->Security->customer_security) { $postData['HDRIMG'] = urlencode(\XLite\Module\CDev\Paypal\Main::getLogo()); } $items = $this->getItems($order); // To avoid total mismatch clear tax and shipping cost $taxAmt = isset($items['PAYMENTREQUEST_0_TAXAMT']) ? $items['PAYMENTREQUEST_0_TAXAMT'] : 0; if (abs($orderTotal - $items['PAYMENTREQUEST_0_ITEMAMT'] - $taxAmt - $shippingCost) <= 1.0E-10) { $params += $items; } else { $itemsAmt = $orderTotal - (double) $shippingCost; $params['PAYMENTREQUEST_0_ITEMAMT'] = $itemsAmt; } $type = \XLite\Core\Session::getInstance()->ec_type; /** @var \XLite\Model\Profile $profile */ $profile = $order->getProfile(); if (\XLite\Module\CDev\Paypal\Model\Payment\Processor\ExpressCheckout::EC_TYPE_SHORTCUT == $type) { $params['REQCONFIRMSHIPPING'] = 0; } if ($profile && $profile->getLogin()) { $params += array('EMAIL' => $profile->getLogin()); } if ($profile && $profile->getBillingAddress()) { $params += array('PHONENUM' => $profile->getBillingAddress()->getPhone()); } if (null !== $shippingCost && $profile && $profile->getShippingAddress()) { /** @var \XLite\Model\Address $address */ $address = $profile->getShippingAddress(); $params += array('ADDROVERRIDE' => 1, 'PAYMENTREQUEST_0_SHIPTONAME' => trim($address->getFirstname() . ' ' . $address->getLastname()), 'PAYMENTREQUEST_0_SHIPTOSTREET' => $address->getStreet(), 'PAYMENTREQUEST_0_SHIPTOSTREET2' => '', 'PAYMENTREQUEST_0_SHIPTOCITY' => $address->getCity(), 'PAYMENTREQUEST_0_SHIPTOSTATE' => $address->getState()->getCode() ?: $address->getState()->getState(), 'PAYMENTREQUEST_0_SHIPTOZIP' => $address->getZipcode(), 'PAYMENTREQUEST_0_SHIPTOCOUNTRY' => $address->getCountry()->getCode()); } if (\XLite\Core\Auth::getInstance()->isLogged()) { $profile = \XLite\Core\Auth::getInstance()->getProfile(); if ($profile->isSocialProfile() && 'PayPal' == $profile->getSocialLoginProvider() && \XLite\Core\Session::getInstance()->paypalAccessToken) { $accessToken = \XLite\Core\Session::getInstance()->paypalAccessToken; if (LC_START_TIME < $accessToken['expirationTime']) { $params['IDENTITYACCESSTOKEN'] = $accessToken['access_token']; } } } return $params; }
/** * Get redirect form fields list * * @return array * @see https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables */ protected function getFormFields() { /** @var \XLite\Model\Order $order */ $order = $this->getOrder(); /** @var \XLite\Model\Currency $currency */ $currency = $order->getCurrency(); $orderTotal = $currency->roundValue($order->getTotal()); $orderNumber = $this->getTransactionId($this->getSetting('prefix')); $shippingCost = $this->getShippingCost($order); $params = array('return' => $this->getReturnURL(null, true), 'cancel_return' => $this->getReturnURL(null, true, true), 'shopping_url' => $this->getReturnURL(null, true, true), 'notify_url' => $this->getCallbackURL(null, true), 'rm' => '2', 'bn' => 'XCART5_Cart', 'upload' => 1, 'charset' => 'UTF-8', 'cmd' => '_cart', 'redirect_cmd' => '_xclick', 'business' => $this->getSetting('account'), 'custom' => $order->getOrderId(), 'invoice' => $orderNumber, 'currency_code' => $currency->getCode(), 'handling' => 0, 'shipping_1' => (double) $shippingCost, 'weight_cart' => 0); if (\XLite\Core\Config::getInstance()->Security->customer_security) { $fields['cpp_header_image'] = Paypal\Main::getLogo(); } $items = $this->getItems($order); // To avoid total mismatch clear tax and shipping cost $taxAmt = isset($items['tax_cart']) ? $items['tax_cart'] : 0; if (abs($orderTotal - $items['items_amount'] - $taxAmt - $shippingCost) <= 1.0E-10) { unset($items['items_amount']); $params = array_merge($params, $items); } else { $params['cmd'] = '_ext-enter'; $params['amount'] = $orderTotal; $params['item_name'] = $this->getItemName(); unset($params['shipping_1']); } $profile = $this->getProfile(); $params = array_merge($params, array('address_override' => 1, 'email' => $profile->getLogin())); if (null !== $shippingCost) { /** @var \XLite\Model\Address $address */ $address = $profile->getShippingAddress(); $params = array_merge($params, array('first_name' => $address->getFirstname(), 'last_name' => $address->getLastname(), 'country' => $this->getCountryFieldValue(), 'state' => $this->getStateFieldValue(), 'address1' => $address->getStreet(), 'address2' => 'n/a', 'city' => $address->getCity(), 'zip' => $address->getZipcode())); } $params = array_merge($params, $this->getPhone()); return $params; }
/** * Returns common request params required for all requests * * @return array */ protected function getCommonParams() { $result = array('VENDOR' => $this->getSetting('vendor'), 'USER' => $this->getSetting('user') ?: $this->getSetting('vendor'), 'PWD' => $this->getSetting('pwd'), 'PARTNER' => $this->getSetting('partner') ?: 'Paypal', 'BUTTONSOURCE' => $this->partnerCode, 'VERBOSITY' => 'HIGH'); // todo: remove?! if (\XLite\Core\Config::getInstance()->Security->customer_security) { $result['HDRIMG'] = \XLite\Module\CDev\Paypal\Main::getLogo(); } return $result; }