/** * start payment * @param OnlineShop_Framework_IPrice $price * @param array $config * * @return string * @throws Exception * @link https://devtools-paypal.com/apiexplorer/PayPalAPIs */ public function initPayment(OnlineShop_Framework_IPrice $price, array $config) { // check params $required = ['ReturnURL' => null, 'CancelURL' => null, 'OrderDescription' => null, 'InvoiceID' => null]; $config = array_intersect_key($config, $required); if (count($required) != count($config)) { throw new Exception(sprintf('required fields are missing! required: %s', implode(', ', array_keys(array_diff_key($required, $config))))); } // create request $x = new stdClass(); $x->SetExpressCheckoutRequest = new stdClass(); $x->SetExpressCheckoutRequest->Version = $this->protocol; $x->SetExpressCheckoutRequest->SetExpressCheckoutRequestDetails = new stdClass(); $x->SetExpressCheckoutRequest->SetExpressCheckoutRequestDetails->ReturnURL = $config['ReturnURL']; $x->SetExpressCheckoutRequest->SetExpressCheckoutRequestDetails->CancelURL = $config['CancelURL']; $x->SetExpressCheckoutRequest->SetExpressCheckoutRequestDetails->NoShipping = "1"; $x->SetExpressCheckoutRequest->SetExpressCheckoutRequestDetails->AllowNote = "0"; $x->SetExpressCheckoutRequest->SetExpressCheckoutRequestDetails->PaymentDetails = $this->createPaymentDetails($price); $x->SetExpressCheckoutRequest->SetExpressCheckoutRequestDetails->OrderDescription = $config['OrderDescription']; $x->SetExpressCheckoutRequest->SetExpressCheckoutRequestDetails->InvoiceID = $config['InvoiceID']; // add optional config foreach ($config as $name => $value) { $x->SetExpressCheckoutRequest->SetExpressCheckoutRequestDetails->{$name} = $value; } // execute request $ret = $this->client->SetExpressCheckout($x); // check Ack if ($ret->Ack == 'Success' || $ret->Ack == 'SuccessWithWarning') { # pay url return 'https://www.' . $this->environment . '.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=' . $ret->Token; } else { $messages = null; $errors = is_array($ret->Errors) ? $ret->Errors : array($ret->Errors); foreach ($errors as $error) { $messages .= $error->LongMessage . "\n"; } throw new Exception($messages); } }