setApiCredentials( config('paypal') ); } elseif (!empty($config)) { $this->setApiCredentials($config); } $this->setRequestData(); } /** * Set default values for configuration. * * @return void */ private function setDefaultValues() { // Set default payment action. if (empty($this->paymentAction)) { $this->paymentAction = 'Sale'; } // Set default locale. if (empty($this->locale)) { $this->locale = 'en_US'; } // Set default value for SSL validation. if (empty($this->validateSSL)) { $this->validateSSL = false; } } /** * Set PayPal API Credentials. * * @param array $credentials * * @throws \Exception * * @return void */ public function setApiCredentials($credentials) { // Setting Default PayPal Mode If not set $this->setApiEnvironment($credentials); // Set API configuration for the PayPal provider $this->setApiProviderConfiguration($credentials); // Set default currency. $this->setCurrency($credentials['currency']); // Set default billing type $this->setBillingType($credentials['billing_type']); // Set Http Client configuration. $this->setHttpClientConfiguration(); } /** * Set API environment to be used by PayPal. * * @param array $credentials * * @return void */ private function setApiEnvironment($credentials) { if (empty($credentials['mode']) || !in_array($credentials['mode'], ['sandbox', 'live'])) { $this->mode = 'live'; } else { $this->mode = $credentials['mode']; } } /** * Set configuration details for the provider. * * @param array $credentials * * @throws \Exception * * @return void */ private function setApiProviderConfiguration($credentials) { // Setting PayPal API Credentials collect($credentials[$this->mode])->map(function ($value, $key) { $this->config[$key] = $value; }); // Setup PayPal API Signature value to use. $this->config['signature'] = empty($this->config['certificate']) ? $this->config['secret'] : $this->config['certificate']; $this->paymentAction = $credentials['payment_action']; $this->locale = $credentials['locale']; $this->certificate = $this->config['certificate']; $this->validateSSL = $credentials['validate_ssl']; $this->setApiProvider($credentials); } /** * Determines which API provider should be used. * * @param array $credentials * * @throws \Exception */ private function setApiProvider($credentials) { if ($this instanceof \Srmklive\PayPal\Services\AdaptivePayments) { $this->setAdaptivePaymentsOptions(); } elseif ($this instanceof \Srmklive\PayPal\Services\ExpressCheckout) { $this->setExpressCheckoutOptions($credentials); } else { throw new \Exception('Invalid api credentials provided for PayPal!. Please provide the right api credentials.'); } } /** * Setup request data to be sent to PayPal. * * @param array $data * * @return \Illuminate\Support\Collection */ protected function setRequestData(array $data = []) { if (($this->post instanceof Collection) && (!$this->post->isEmpty())) { unset($this->post); } $this->post = new Collection($data); return $this->post; } /** * Set other/override PayPal API parameters. * * @param array $options * * @return $this */ public function addOptions(array $options) { $this->options = $options; return $this; } /** * Function to set currency. * * @param string $currency * * @throws \Exception * * @return $this */ public function setCurrency($currency = 'USD') { $allowedCurrencies = ['AUD', 'BRL', 'CAD', 'CZK', 'DKK', 'EUR', 'HKD', 'HUF', 'ILS', 'INR', 'JPY', 'MYR', 'MXN', 'NOK', 'NZD', 'PHP', 'PLN', 'GBP', 'SGD', 'SEK', 'CHF', 'TWD', 'THB', 'USD', 'RUB']; // Check if provided currency is valid. if (!in_array($currency, $allowedCurrencies)) { throw new \Exception('Currency is not supported by PayPal.'); } $this->currency = $currency; return $this; } /** * Function to set billing type. * * @param string $billingType * * @throws \Exception * * @return $this */ public function setBillingType($billingType = 'MerchantInitiatedBilling') { $allowedBillingTypes = ['MerchantInitiatedBilling', 'MerchantInitiatedBillingSingleAgreement', 'RecurringPayments']; if ($billingType != null && !in_array($billingType, $allowedBillingTypes)) { throw new \Exception('Billing type is not supported by PayPal.'); } $this->billingType = $billingType; return $this; } /** * Retrieve PayPal IPN Response. * * @param array $post * * @return array */ public function verifyIPN($post) { $this->setRequestData($post); $this->apiUrl = $this->config['ipn_url']; return $this->doPayPalRequest('verifyipn'); } /** * Create request payload to be sent to PayPal. * * @param string $method */ private function createRequestPayload($method) { $config = array_merge([ 'USER' => $this->config['username'], 'PWD' => $this->config['password'], 'SIGNATURE' => $this->config['signature'], 'VERSION' => 123, 'METHOD' => $method, ], $this->options); $this->post = $this->post->merge($config); if ($method === 'verifyipn') { $this->post->forget('METHOD'); } } /** * Parse PayPal NVP Response. * * @param string $method * @param array|\Psr\Http\Message\StreamInterface $response * * @return array */ private function retrieveData($method, $response) { if ($method === 'verifyipn') { return $response; } parse_str($response, $output); return $output; } }