public function testEntryValidity() { $delivery_address_id = $this->order->getDeliveryOrderAddressId(); $delivery_address = OrderAddressQuery::create()->findPk($delivery_address_id); $delivery_address->setCountryId(CountryQuery::create()->findOneByIsoalpha3("FRA")->getId()); // France metropolitan $customer = $this->order->getCustomer(); $customer->getDefaultAddress()->setCellphone("0600000000"); $this->order->setCustomer($customer); /** * Valid cellphone and Country * => True */ $this->assertTrue($this->instance->isValid()); /** * empty cellphone * => False */ $customer->getDefaultAddress()->setCellphone(null); $this->assertFalse($this->instance->isValid()); /** * Invalid country * => False */ $delivery_address->setCountryId(CountryQuery::create()->findOneByIsoalpha3("USA")->getId()); $customer->getDefaultAddress()->setCellphone("0600000000"); $this->assertFalse($this->instance->isValid()); }
/** * @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']); }
/** * @return boolean * Check if the export entry is valid */ public function isValid() { /** * Get country */ $country = $this->getDeliveryOrderCountry(); /** * Do the checks */ $checks = $this->order->getCustomer()->getDefaultAddress()->getCellphone() !== null; $checks &= PredictExport::translateCountry($country) !== null; return (bool) $checks; }
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; }
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]); }
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; }
public function saveExtraInformation(&$data, Order $order, Address $address) { $service = $this->getRequest()->request->get("tnt_service"); //By default, if no service is selected, choose the INDIVIDUAL ONE if (!in_array($service, ['INDIVIDUAL', 'ENTERPRISE', 'DEPOT', 'DROPOFFPOINT'])) { $this->getRequest()->request->set('tnt_service', 'INDIVIDUAL'); $data['tnt_service'] = 'INDIVIDUAL'; TNTFrance::setExtraOrderData($this->getRequest()->getSession()->getSessionCart()->getId(), $data); /** @var \Thelia\Model\Customer $customer */ if (null == ($customer = $order->getCustomer())) { //Customer in front $customer = $this->getRequest()->getSession()->getCustomerUser(); } //We must ask fasaibility to tnt /** @var Feasibility $ws */ $ws = $this->container->get('tnt.ws.factory')->get('feasibility'); $ws->setZipCode($customer->getDefaultAddress()->getZipcode())->setCity($customer->getDefaultAddress()->getCity())->setType($data['tnt_service']); $choices = $ws->exec(); if (count($choices) > 0) { /** @var \TNTFrance\WebService\Model\TNTService $tntService */ $tntService = $choices[0]; $this->getRequest()->request->set('tnt_serviceCode', $tntService->getServiceCode() . '-' . $tntService->getServiceLabel()); } if ($customer->getDefaultAddress()->getCellphone()) { $phoneNumber = $customer->getDefaultAddress()->getCellphone(); } elseif ($customer->getDefaultAddress()->getPhone()) { $phoneNumber = $customer->getDefaultAddress()->getPhone(); } else { throw new \Exception($this->trans('You must have a phone number to continue this order')); } $this->getRequest()->request->set('tnt_phoneNumber', str_replace(" ", "", $phoneNumber)); $service = 'INDIVIDUAL'; //throw new \Exception($this->trans('Invalid TNT service')); } switch ($service) { case 'INDIVIDUAL': if (null !== ($city = $this->getRequest()->request->get('tnt_city'))) { $address->setCity($city)->save(); } $fields = ['tnt_phoneNumber', 'tnt_accessCode', 'tnt_floorNumber', 'tnt_buldingId']; break; case 'ENTERPRISE': if (null !== ($city = $this->getRequest()->request->get('tnt_city'))) { $address->setCity($city)->save(); } $fields = ['tnt_instructions']; break; case 'DEPOT': $fields = ['tnt_pexCode', 'tnt_city', 'tnt_instructions', 'tnt_depot_address']; break; case 'DROPOFFPOINT': $fields = ['tnt_xettCode', 'tnt_contactLastName', 'tnt_contactFirstName', 'tnt_dop_address']; break; default: $fields = []; break; } foreach ($fields as $field) { $value = $this->getRequest()->request->get($field); if (in_array($field, ['tnt_dop_address', 'tnt_depot_address'])) { $data[$field] = json_decode($value); } else { $data[$field] = $value; } } // save the service code selected $serviceInfos = explode('-', $this->getRequest()->request->get("tnt_serviceCode")); $data["tnt_serviceCode"] = $serviceInfos[0]; $data["tnt_serviceLabel"] = $serviceInfos[1]; $errors = DataValidator::validateData($data, $service); if (count($errors)) { $message = ''; foreach ($errors as $error) { $message .= $error->getMessage() . '<br>'; } throw new \Exception($message); } }
/** * Send payment confirmation mail * @param OrderModel $order * @throws \Exception */ public function sendConfirmationMail(OrderModel $order) { $storeName = ConfigQuery::read('store_name', false); $storeSite = ConfigQuery::read('url_site', false); $contactEmail = ConfigQuery::read('store_email', false); Tlog::getInstance()->info("Sending Stripe payment confirmation email from store contact e-mail {$contactEmail}"); if ($contactEmail) { $this->getMailer()->sendEmailToCustomer(StripePayment::CONFIRMATION_MESSAGE_NAME, $order->getCustomer(), ["order_ref" => $order->getRef(), "store_name" => $storeName, "store_url" => $storeSite]); } }
/** * 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(); }
/** * 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 } }