/** * @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']); }
public static function getFromOrder(Order $order) { $translator = Translator::getInstance(); if ($order->getDeliveryModuleId() !== TNTFrance::getModuleId()) { throw new \InvalidArgumentException($translator->trans("The order %id does not use the", ['id' => $order->getId()], TNTFrance::MESSAGE_DOMAIN)); } $data = TNTFrance::getExtraOrderData($order->getId(), false); if (empty($data)) { throw new \InvalidArgumentException($translator->trans("No TNT data for order %id", ['id' => $order->getId()], TNTFrance::MESSAGE_DOMAIN)); } $receiver = new TNTReceiver(); $receiver->setType($data['tnt_service']); $receiver->setEmailAddress($order->getCustomer()->getEmail()); if (array_key_exists('tnt_instructions', $data)) { $receiver->setInstructions($data['tnt_instructions']); } if (array_key_exists('tnt_phoneNumber', $data)) { $phoneNumber = str_replace(" ", "", $data['tnt_phoneNumber']); $receiver->setPhoneNumber($phoneNumber); } //todo : $receiver->setSendNotification(TNTFrance::getConfigValue(TNTFranceConfigValue::NOTIFICATION_USER)); switch ($data['tnt_service']) { case 'INDIVIDUAL': case 'ENTERPRISE': $address = OrderAddressQuery::create()->findPk($order->getDeliveryOrderAddressId()); if (null !== $address) { $receiver->setName($address->getCompany())->setAddress1($address->getAddress1())->setAddress2($address->getAddress2())->setZipCode($address->getZipcode())->setCity($address->getCity())->setContactLastName($address->getLastname())->setContactFirstName($address->getFirstname()); if (array_key_exists('tnt_accessCode', $data)) { $receiver->setAccessCode($data['tnt_accessCode']); } if (array_key_exists('tnt_floorNumber', $data)) { $receiver->setAccessCode($data['tnt_floorNumber']); } if (array_key_exists('tnt_buildingId', $data)) { $receiver->setAccessCode($data['tnt_buildingId']); } } break; case 'DEPOT': $receiver->setTypeId($data['tnt_pexcode'])->setCity($data['tnt_depot_address']['city']); break; case 'DROPOFFPOINT': $receiver->setTypeId($data['tnt_exttcode']); break; default: throw new \InvalidArgumentException($translator->trans("TNT service %service is not valid for order %id", ['id' => $order->getId(), 'service' => $data['tnt_service']], TNTFrance::MESSAGE_DOMAIN)); } return $receiver; }
/** * @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); }
/** * Render the payment gateway template. The module should provide the gateway URL and the form fields names and values. * * @param Order $order the order * @param string $gateway_url the payment gateway URL * @param array $form_data an associative array of form data, that will be rendered as hiddent fields * * @return Response the HTTP response. */ public function generateGatewayFormResponse($order, $gateway_url, $form_data) { /** @var ParserInterface $parser */ $parser = $this->getContainer()->get("thelia.parser"); $parser->setTemplateDefinition(${$parser}->getTemplateHelper()->getActiveFrontTemplate()); $renderedTemplate = $parser->render("order-payment-gateway.html", array("order_id" => $order->getId(), "cart_count" => $this->getRequest()->getSession()->getSessionCart($this->getDispatcher())->getCartItems()->count(), "gateway_url" => $gateway_url, "payment_form_data" => $form_data)); return Response::create($renderedTemplate); }
/** * Filter the query by a related \Thelia\Model\Order object * * @param \Thelia\Model\Order|ObjectCollection $order The related object(s) to use as filter * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL * * @return ChildOrderCouponQuery The current query, for fluid interface */ public function filterByOrder($order, $comparison = null) { if ($order instanceof \Thelia\Model\Order) { return $this->addUsingAlias(OrderCouponTableMap::ORDER_ID, $order->getId(), $comparison); } elseif ($order instanceof ObjectCollection) { if (null === $comparison) { $comparison = Criteria::IN; } return $this->addUsingAlias(OrderCouponTableMap::ORDER_ID, $order->toKeyValue('PrimaryKey', 'Id'), $comparison); } else { throw new PropelException('filterByOrder() only accepts arguments of type \\Thelia\\Model\\Order or Collection'); } }
public function sendEmailFromOrder(Order $order, $parcelResponses = []) { $customer = $order->getCustomer(); $this->mailer->sendEmailToCustomer('mail_tnt_france', $customer, ['customer_id' => $customer->getId(), 'order_id' => $order->getId(), 'order_ref' => $order->getRef(), 'order_date' => $order->getCreatedAt(), 'update_date' => $order->getUpdatedAt(), 'parcel_responses' => $parcelResponses]); }
/** * Declares an association between this object and a ChildOrder object. * * @param ChildOrder $v * @return \Thelia\Model\OrderProduct The current object (for fluent API support) * @throws PropelException */ public function setOrder(ChildOrder $v = null) { if ($v === null) { $this->setOrderId(NULL); } else { $this->setOrderId($v->getId()); } $this->aOrder = $v; // Add binding for other direction of this n:n relationship. // If this object has already been added to the ChildOrder object, it will not be re-added. if ($v !== null) { $v->addOrderProduct($this); } return $this; }
public static function getFromOrder(Order $order, $allInOne = true) { $translator = Translator::getInstance(); if ($order->getDeliveryModuleId() !== TNTFrance::getModuleId()) { throw new \InvalidArgumentException($translator->trans("The order %id does not use the", ['id' => $order->getId()], TNTFrance::MESSAGE_DOMAIN)); } $data = TNTFrance::getExtraOrderData($order->getId(), false); if (empty($data)) { throw new \InvalidArgumentException($translator->trans("No TNT data for order %id", ['id' => $order->getId()], TNTFrance::MESSAGE_DOMAIN)); } $maxWeightPackage = TNTFrance::getConfigValue(TNTFranceConfigValue::MAX_WEIGHT_PACKAGE, 25); $parcelsRequest = []; $orderTotalWeight = 0; $packages = []; foreach ($order->getOrderProducts() as $orderProduct) { $orderProductWeight = $orderProduct->getQuantity() * $orderProduct->getWeight(); $orderTotalWeight += $orderProductWeight; if (!$allInOne) { //If customer has choosen a manual number of package if ($orderProduct->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE) && intval($orderProduct->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE)) == $orderProduct->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE)) { $orderProductPackages = $orderProduct->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE); } else { if ($maxWeightPackage != 0) { $orderProductPackages = ceil($orderProductWeight / $maxWeightPackage); } else { $orderProductPackages = 1; } } //Divide the weight between packages for ($i = 1; $i <= $orderProductPackages; $i++) { $packages[] = round($orderProductWeight / $orderProductPackages, 2); } } } if ($allInOne) { //If customer has choosen a manual number of package if ($order->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE) && intval($order->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE)) == $order->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE)) { $orderPackages = $order->getVirtualColumn(TNTFranceCreateExpeditionEvent::PACKAGE); } else { $orderPackages = ceil($orderTotalWeight / $maxWeightPackage); } //Divide the weight between packages for ($i = 1; $i <= $orderPackages; $i++) { $packages[] = round($orderTotalWeight / $orderPackages, 2); } } foreach ($packages as $key => $packageWeight) { $parcelRequest = new TNTParcelRequest(); $parcelRequest->setSequenceNumber($key + 1)->setCustomerReference($order->getCustomer()->getRef())->setWeight($packageWeight); $parcelsRequest[] = $parcelRequest; } if (count($parcelsRequest) == 0) { $parcelRequest = new TNTParcelRequest(); $weight = 0.0; /** @var OrderProduct $orderProduct */ foreach ($order->getOrderProducts() as $orderProduct) { $weight += $orderProduct->getQuantity() * floatval($orderProduct->getWeight()); } $parcelRequest->setWeight($weight); $parcelRequest->setSequenceNumber(1); //$parcelRequest->setComment($data['tnt_instructions']); $parcelRequest->setCustomerReference($order->getCustomer()->getRef()); $parcelsRequest[] = $parcelRequest; } return $parcelsRequest; }
/** * 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(); }
/** * Exclude object from result * * @param ChildOrder $order Object to remove from the list of results * * @return ChildOrderQuery The current query, for fluid interface */ public function prune($order = null) { if ($order) { $this->addUsingAlias(OrderTableMap::ID, $order->getId(), Criteria::NOT_EQUAL); } return $this; }
public function pay(Order $order) { return RedirectResponse::create(URL::getInstance()->absoluteUrl("/module/paypal/goto/" . $order->getId())); }
/** * 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); }
/** * * 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 } }