Exemple #1
0
 /**
  * @see : 3.1.1 PAYLINE-GUIDE-Descriptif des appels webservices.
  * @param Order $order
  * @return RedirectResponse
  * @throws \Exception
  */
 public function doWebPayment(Order $order)
 {
     /** @var Customer $subscriber */
     $customer = $order->getCustomer();
     $array['version'] = self::VERSION;
     $array['returnURL'] = $this->frontRouter->generate('order.placed', ['order_id' => $order->getId()], true);
     $array['cancelURL'] = $this->frontRouter->generate('order.failed', ['order_id' => $order->getId(), 'message' => 'payline'], true);
     $array['notificationURL'] = $this->paylineRouter->generate('payline_notify', ['orderId' => $order->getId()], true);
     $amount = (double) $order->getTotalAmount() * 100;
     $currency = CurrencyNumericCodeQuery::create()->findPk($order->getCurrency()->getCode())->getNumericCode();
     $array['payment']['amount'] = $amount;
     $array['payment']['currency'] = $currency;
     $array['payment']['action'] = '100';
     $array['payment']['mode'] = 'CPT';
     $array['payment']['contractNumber'] = $this->config->getContractNumber();
     $array['order']['ref'] = $order->getRef();
     $array['order']['amount'] = $amount;
     $array['order']['currency'] = $currency;
     $array['order']['date'] = $order->getUpdatedAt()->format('d/m/Y H:m');
     $array['buyer']['lastName'] = $customer->getLastName();
     $array['buyer']['firstName'] = $customer->getFirstName();
     $array['buyer']['email'] = $customer->getEmail();
     $array['securityMode'] = 'SSL';
     $response = $this->payline->doWebPayment($array);
     $code = $response['result']['code'];
     if ($code !== '00000') {
         $message = isset($response['result']['longMessage']) ? $response['result']['longMessage'] : 'Error undefined';
         $this->logger->error($message);
         throw new \Exception($message);
     }
     return new RedirectResponse($response['redirectURL']);
 }
Exemple #2
0
 /**
  * @return mixed
  */
 public function pay(Order $order)
 {
     $c = Config::read(CmCIC::JSON_CONFIG_PATH);
     $currency = $order->getCurrency()->getCode();
     $opts = "";
     $cmCicRouter = $this->container->get('router.cmcic');
     $mainRouter = $this->container->get('router.front');
     $vars = array("url_bank" => sprintf(self::CMCIC_URLPAIEMENT, $c["CMCIC_SERVER"], $c["CMCIC_PAGE"]), "version" => $c["CMCIC_VERSION"], "TPE" => $c["CMCIC_TPE"], "date" => date("d/m/Y:H:i:s"), "montant" => (string) round($order->getTotalAmount(), 2) . $currency, "reference" => self::harmonise($order->getId(), 'numeric', 12), "url_retour" => URL::getInstance()->absoluteUrl($cmCicRouter->generate("cmcic.receive", array(), Router::ABSOLUTE_URL)) . "/" . (string) $order->getId(), "url_retour_ok" => URL::getInstance()->absoluteUrl($mainRouter->generate("order.placed", array("order_id" => (string) $order->getId()), Router::ABSOLUTE_URL)), "url_retour_err" => URL::getInstance()->absoluteUrl($cmCicRouter->generate("cmcic.payfail", array("order_id" => (string) $order->getId()), Router::ABSOLUTE_URL)), "lgue" => strtoupper($this->getRequest()->getSession()->getLang()->getCode()), "societe" => $c["CMCIC_CODESOCIETE"], "texte-libre" => "0", "mail" => $this->getRequest()->getSession()->getCustomerUser()->getEmail(), "nbrech" => "", "dateech1" => "", "montantech1" => "", "dateech2" => "", "montantech2" => "", "dateech3" => "", "montantech3" => "", "dateech4" => "", "montantech4" => "");
     $hashable = sprintf(self::CMCIC_CGI1_FIELDS, $vars["TPE"], $vars["date"], $vars["montant"], $vars["reference"], $vars["texte-libre"], $vars["version"], $vars["lgue"], $vars["societe"], $vars["mail"], $vars["nbrech"], $vars["dateech1"], $vars["montantech1"], $vars["dateech2"], $vars["montantech2"], $vars["dateech3"], $vars["montantech3"], $vars["dateech4"], $vars["montantech4"], $opts);
     $mac = self::computeHmac($hashable, self::getUsableKey($c["CMCIC_KEY"]));
     $vars["MAC"] = $mac;
     $parser = $this->container->get("thelia.parser");
     $parser->setTemplateDefinition(new TemplateDefinition('module_cmcic', TemplateDefinition::FRONT_OFFICE));
     $render = $parser->render("gotobankservice.html", $vars);
     return Response::create($render);
 }
 /**
  * Send data to Stripe API & get response
  * @param OrderModel $order
  * @return \Stripe\Charge
  */
 public function stripeCharge(OrderModel $order)
 {
     $stripeApiCustomer = \Stripe\Customer::create(['email' => $order->getCustomer()->getEmail(), 'card' => $this->request->getSession()->get('stripeToken')]);
     \Stripe\Charge::create(['customer' => $stripeApiCustomer, 'amount' => $order->getTotalAmount() * 100, 'currency' => $order->getCurrency()->getCode()]);
 }
Exemple #4
0
 /**
  * Create the form parameter list for the given order
  *
  * @param Order $order
  * @param string $payment_config single or multiple payment - see vads_payment_config parameter description
  *
  * @throws \InvalidArgumentException if an unsupported currency is used in order
  * @return array the payzen form parameters
  */
 protected function getPayzenParameters(Order $order, $payment_config)
 {
     $payzenApi = new PayzenMultiApi();
     // Total order amount
     $amount = $order->getTotalAmount();
     /** @var  PayzenCurrency $currency */
     // Currency conversion to numeric ISO 1427 code
     if (null === ($currency = $payzenApi->findCurrencyByAlphaCode($order->getCurrency()->getCode()))) {
         throw new \InvalidArgumentException(Translator::getInstance()->trans("Unsupported order currency: '%code'", array('%code' => $order->getCurrency()->getCode()), Payzen::MODULE_DOMAIN));
     }
     $customer = $order->getCustomer();
     // Get customer lang code and locale
     if (null !== ($langObj = LangQuery::create()->findPk($customer->getLang()))) {
         $customer_lang = $langObj->getCode();
         $locale = $langObj->getLocale();
     } else {
         $customer_lang = PayzenConfigQuery::read('default_language');
         $locale = LangQuery::create()->findOneByByDefault(true)->getLocale();
     }
     $address = $customer->getDefaultAddress();
     // Customer phone (first non empty)
     $phone = $address->getPhone();
     if (empty($phone)) {
         $phone = $address->getCellphone();
     }
     // Transaction ID
     $transaction_id = $this->getTransactionId();
     $order->setTransactionRef($transaction_id)->save();
     $payzen_params = array('vads_version' => 'V2', 'vads_contrib' => 'Thelia version ' . ConfigQuery::read('thelia_version'), 'vads_action_mode' => 'INTERACTIVE', 'vads_payment_config' => $this->getPaymentConfigValue($payment_config, $amount, $currency), 'vads_page_action' => 'PAYMENT', 'vads_return_mode' => 'POST', 'vads_shop_name' => ConfigQuery::read("store_name", ''), 'vads_url_success' => $this->getPaymentSuccessPageUrl($order->getId()), 'vads_url_refused' => $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans("Your payement has been refused"), [], Payzen::MODULE_DOMAIN), 'vads_url_referral' => $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans("Authorization request was rejected"), [], Payzen::MODULE_DOMAIN), 'vads_url_cancel' => $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans("You canceled the payement"), [], Payzen::MODULE_DOMAIN), 'vads_url_error' => $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans("An internal error occured"), [], Payzen::MODULE_DOMAIN), 'vads_site_id' => PayzenConfigQuery::read('site_id'), 'vads_key_test' => PayzenConfigQuery::read('test_certificate'), 'vads_key_prod' => PayzenConfigQuery::read('production_certificate'), 'vads_ctx_mode' => PayzenConfigQuery::read('mode'), 'vads_platform_url' => PayzenConfigQuery::read('platform_url'), 'vads_default_language' => PayzenConfigQuery::read('default_language'), 'vads_available_languages' => PayzenConfigQuery::read('available_languages'), 'vads_capture_delay' => PayzenConfigQuery::read('banking_delay'), 'vads_validation_mode' => PayzenConfigQuery::read('validation_mode'), 'vads_payment_cards' => PayzenConfigQuery::read('allowed_cards'), 'vads_redirect_enabled' => PayzenConfigQuery::read('redirect_enabled'), 'vads_redirect_success_timeout' => PayzenConfigQuery::read('success_timeout'), 'vads_redirect_success_message' => PayzenConfigQuery::read('success_message'), 'vads_redirect_error_timeout' => PayzenConfigQuery::read('failure_timeout'), 'vads_redirect_error_message' => PayzenConfigQuery::read('failure_message'), 'vads_language' => $customer_lang, 'vads_order_id' => $order->getId(), 'vads_currency' => $currency->num, 'vads_amount' => $currency->convertAmountToInteger($amount), 'vads_trans_id' => $transaction_id, 'vads_trans_date' => gmdate("YmdHis"), 'vads_threeds_mpi' => $amount >= PayzenConfigQuery::read('three_ds_minimum_order_amount', 0) ? 2 : 0, 'vads_cust_email' => $customer->getEmail(), 'vads_cust_id' => $customer->getId(), 'vads_cust_title' => $customer->getCustomerTitle()->setLocale($locale)->getLong(), 'vads_cust_last_name' => $customer->getLastname(), 'vads_cust_first_name' => $customer->getFirstname(), 'vads_cust_address' => trim($address->getAddress1() . ' ' . $address->getAddress2() . ' ' . $address->getAddress3()), 'vads_cust_city' => $address->getCity(), 'vads_cust_zip' => $address->getZipcode(), 'vads_cust_country' => CountryQuery::create()->findPk($address->getCountryId())->getIsoalpha2(), 'vads_cust_phone' => $phone);
     foreach ($payzen_params as $payzen_parameter_name => $value) {
         $payzenApi->set($payzen_parameter_name, $value);
     }
     return $payzenApi->getRequestFields();
 }
 /**
  *
  *  Method used by payment gateway.
  *
  *  If this method return a \Thelia\Core\HttpFoundation\Response instance, this response is send to the
  *  browser.
  *
  *  In many cases, it's necessary to send a form to the payment gateway. On your response you can return this form already
  *  completed, ready to be sent
  *
  * @param  \Thelia\Model\Order $order processed order
  * @return null|\Thelia\Core\HttpFoundation\Response
  */
 public function pay(Order $order)
 {
     $this->loadBitpayKeys();
     $client = new \Bitpay\Client\Client();
     $adapter = new \Bitpay\Client\Adapter\CurlAdapter();
     $config = new BitpayPaymentsConfig();
     $config->pushValues();
     if ($config->getSandbox()) {
         $pairingKey = $config->getPairingKeySandbox();
         $apiKey = $config->getApiKeySandbox();
         $network = new \Bitpay\Network\Testnet();
         $environment = "Sandbox";
     } else {
         $pairingKey = $config->getPairingKey();
         $apiKey = $config->getApiKey();
         $network = new \Bitpay\Network\Livenet();
         $environment = "Live";
     }
     $client->setPrivateKey($this->privateKey);
     $client->setPublicKey($this->publicKey);
     $client->setNetwork($network);
     $client->setAdapter($adapter);
     if (!isset($apiKey) || $apiKey == '') {
         // must create API key
         if (!isset($pairingKey) || $pairingKey == '') {
             // error: no pairing key
             $error = "Thelia BitpayPayments error: No API key or pairing key for environment {$environment} provided.";
             Tlog::getInstance()->error($error);
             throw new \Exception($error);
         } else {
             // pairing key available, now trying to get an API key
             $sin = \Bitpay\SinKey::create()->setPublicKey($this->publicKey)->generate();
             try {
                 $token = $client->createToken(array('pairingCode' => $pairingKey, 'label' => 'Thelia BitpayPayments', 'id' => (string) $sin));
             } catch (\Exception $e) {
                 $request = $client->getRequest();
                 $response = $client->getResponse();
                 $error = 'Thelia BitpayPayments error:' . PHP_EOL . PHP_EOL . $request . PHP_EOL . PHP_EOL . $response . PHP_EOL . PHP_EOL;
                 Tlog::getInstance()->error($error);
                 throw new \Exception($error);
             }
             $config->setApiKeyCurrentEnvironment($token->getToken());
             $config->setPairingKeyCurrentEnvironment('');
         }
     }
     // token should be available now
     $token = new \Bitpay\Token();
     $token->setToken($config->getApiKeyCurrentEnvironment());
     $client->setToken($token);
     $invoice = new \Bitpay\Invoice();
     $item = new \Bitpay\Item();
     $item->setCode('testCode');
     $item->setDescription('Purchase');
     $item->setPrice($order->getTotalAmount());
     $invoice->setItem($item);
     $invoice->setCurrency(new \Bitpay\Currency($order->getCurrency()->getCode()));
     try {
         $client->createInvoice($invoice);
     } catch (\Exception $e) {
         $request = $client->getRequest();
         $response = $client->getResponse();
         $error = 'Thelia BitpayPayments error:' . PHP_EOL . PHP_EOL . $request . PHP_EOL . PHP_EOL . $response . PHP_EOL . PHP_EOL;
         Tlog::getInstance()->error($error);
         throw new \Exception($error);
     }
 }
Exemple #6
0
 /**
  * Payment gateway invocation
  *
  * @param  Order $order processed order
  * @return Response the HTTP response
  */
 protected function doPay(Order $order)
 {
     if ('TEST' == Paybox::getConfigValue('mode', false)) {
         $platformUrl = Paybox::getConfigValue('url_serveur_test', false);
     } else {
         $platformUrl = Paybox::getConfigValue('url_serveur', false);
     }
     // Be sure to have a valid platform URL, otherwise give up
     if (false === $platformUrl) {
         throw new \InvalidArgumentException(Translator::getInstance()->trans("The platform URL is not defined, please check Paybox module configuration.", [], Paybox::MODULE_DOMAIN));
     }
     $hashAlgo = $this->getHashAlgorithm();
     $clefPrivee = Paybox::getConfigValue('clef_privee');
     // Generate a transaction ID
     $transactionId = sprintf("%010d", $order->getId());
     $order->setTransactionRef($transactionId)->save();
     $paybox_params = ['PBX_SITE' => Paybox::getConfigValue('numero_site'), 'PBX_RANG' => Paybox::getConfigValue('rang_site'), 'PBX_IDENTIFIANT' => Paybox::getConfigValue('identifiant_interne'), 'PBX_RETOUR' => self::PARAMETRES_RETOUR, 'PBX_HASH' => $hashAlgo, 'PBX_SECRET' => $clefPrivee, 'PBX_ANNULE' => Paybox::getConfigValue('url_retour_abandon'), 'PBX_EFFECTUE' => Paybox::getConfigValue('url_retour_succes'), 'PBX_REFUSE' => Paybox::getConfigValue('url_retour_refus'), 'PBX_REPONDRE_A' => Paybox::getConfigValue('url_ipn'), 'PBX_TOTAL' => round(100 * $order->getTotalAmount()), 'PBX_DEVISE' => $this->getCurrencyIso4217NumericCode($order->getCurrency()->getCode()), 'PBX_CMD' => $transactionId, 'PBX_PORTEUR' => $order->getCustomer()->getEmail(), 'PBX_TIME' => date("c"), 'PBX_RUF1' => 'POST'];
     // Generate signature
     $param = '';
     foreach ($paybox_params as $key => $value) {
         $param .= "&" . $key . '=' . $value;
     }
     $param = ltrim($param, '&');
     $binkey = pack('H*', $clefPrivee);
     $paybox_params['PBX_HMAC'] = strtoupper(hash_hmac($hashAlgo, $param, $binkey));
     return $this->generateGatewayFormResponse($order, $platformUrl, $paybox_params);
 }
Exemple #7
0
 /**
  *
  *  Method used by payment gateway.
  *
  *  If this method return a \Thelia\Core\HttpFoundation\Response instance, this response is send to the
  *  browser.
  *
  *  In many cases, it's necessary to send a form to the payment gateway.
  *  On your response you can return this form already completed, ready to be sent
  *
  * @param  \Thelia\Model\Order                       $order processed order
  * @return null|\Thelia\Core\HttpFoundation\Response
  */
 public function pay(Order $order)
 {
     $pathBin = self::getBinDirectory() . 'request';
     $atosCurrency = AtosCurrencyQuery::create()->findPk($order->getCurrency()->getCode());
     if (null == $atosCurrency) {
         throw new \InvalidArgumentException(sprintf("Atos does not supprot this currency : %s", $order->getCurrency()->getCode()));
     }
     $amount = $order->getTotalAmount();
     $amount = number_format($amount, $atosCurrency->getDecimals(), '', '');
     $transactionId = $this->generateTransactionID();
     $order->setTransactionRef($transactionId)->save();
     $router = $this->getContainer()->get('router.atos');
     $this->addParam('pathfile', self::getPathfilePath())->addParam('merchant_id', self::getConfigValue('atos_merchantId'))->addParam('customer_email', $order->getCustomer()->getEmail())->addParam('currency_code', $atosCurrency->getAtosCode())->addParam('amount', $amount)->addParam('language', $order->getLang()->getCode())->addParam('transaction_id', $transactionId)->addParam('order_id', $order->getId())->addParam('automatic_response_url', URL::getInstance()->absoluteUrl($router->generate('atos.payment.confirmation')))->addParam('cancel_return_url', $this->getPaymentFailurePageUrl($order->getId(), Translator::getInstance()->trans('you cancel the payment', [], Atos::MODULE_DOMAIN)))->addParam('normal_return_url', $this->getPaymentSuccessPageUrl($order->getId()));
     $encrypt = exec(sprintf("%s %s", $pathBin, $this->getParameters()));
     if (!empty($encrypt)) {
         $datas = explode('!', $encrypt);
         if ($datas[1] == '' && $datas[2] == '') {
             throw new \RuntimeException(Translator::getInstance()->trans('Request binary not found in "%path"', ['%path' => $pathBin]));
         } elseif ($datas[1] != 0) {
             throw new \RuntimeException($datas[2]);
         } else {
             $parser = $this->getContainer()->get('thelia.parser');
             $parser->setTemplateDefinition($parser->getTemplateHelper()->getActiveFrontTemplate());
             $content = $parser->renderString(file_get_contents(__DIR__ . DS . 'templates' . DS . 'atos' . DS . 'payment.html'), ['site_name' => self::getConfigValue('store_name'), 'form' => $datas[3]]);
             return Response::create($content);
         }
     } else {
         throw new \RuntimeException(Translator::getInstance()->trans('Empty response recevied from Atos binary "%path". Please check path and permissions.', ['%path' => $pathBin], self::MODULE_DOMAIN));
         // FIXME : show something to the customer
     }
 }