/** * Builds form given return, success and fail urls. * * @return FormView */ public function buildForm() { $formBuilder = $this->formFactory->createNamedBuilder(null); $orderId = $this->paymentBridge->getOrderId(); $orderCurrency = $this->paymentBridge->getCurrency(); $this->checkCurrency($orderCurrency); /** * Creates the success return route, when coming back * from PayPal web checkout. */ $successReturnUrl = $this->urlFactory->getSuccessReturnUrlForOrderId($orderId); /** * Creates the cancel payment route, when cancelling * the payment process from PayPal web checkout. */ $cancelReturnUrl = $this->urlFactory->getCancelReturnUrlForOrderId($orderId); /** * Creates the IPN payment notification route, * which is triggered after PayPal processes the * payment and returns the validity of the transaction. * * For forther information * * https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables/ * https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNIntro/ */ $processUrl = $this->urlFactory->getProcessUrlForOrderId($orderId); $formBuilder->setAction($this->urlFactory->getApiEndpoint())->setMethod('POST')->add('business', 'hidden', ['data' => $this->business])->add('return', 'hidden', ['data' => $successReturnUrl])->add('cancel_return', 'hidden', ['data' => $cancelReturnUrl])->add('notify_url', 'hidden', ['data' => $processUrl])->add('currency_code', 'hidden', ['data' => $orderCurrency])->add('env', 'hidden', ['data' => '']); /** * Create a PayPal cart line for each order line. * * Project specific PaymentBridgeInterface::getExtraData * should return an array of this form * * ['items' => [ * 0 => [ 'item_name' => 'Item 1', 'amount' => 1234, 'quantity' => 2 ], * 1 => [ 'item_name' => 'Item 2', 'amount' => 2345, 'quantity' => 1 ], * ]] * * The 'items' key consists of an array with the basic information * of each line of the order. Amount is the price of the product, * not the total of the order line */ $cartData = $this->paymentBridge->getExtraData(); $itemsData = $cartData['items']; $iteration = 1; foreach ($itemsData as $orderLine) { $formBuilder->add('item_name_' . $iteration, 'hidden', ['data' => $orderLine['item_name']])->add('amount_' . $iteration, 'hidden', ['data' => $orderLine['amount'] / 100])->add('quantity_' . $iteration, 'hidden', ['data' => $orderLine['quantity']]); ++$iteration; } if (isset($cartData['discount_amount_cart'])) { $formBuilder->add('discount_amount_cart', 'hidden', ['data' => $cartData['discount_amount_cart'] / 100]); } return $formBuilder->getForm()->createView(); }
/** * Check and set param for payment. * * @param StripeMethod $paymentMethod Payment method * @param float $amount Amount * * @return array Charge params * * @throws PaymentAmountsNotMatchException * @throws PaymentOrderNotFoundException */ private function prepareData(StripeMethod $paymentMethod, $amount) { /// first check that amounts are the same $cartAmount = intval($this->paymentBridge->getAmount()); /** * If both amounts are different, execute Exception. */ if (abs($amount - $cartAmount) > 1.0E-5) { throw new PaymentAmountsNotMatchException(); } /** * At this point, order must be created given a cart, and placed in PaymentBridge. * * So, $this->paymentBridge->getOrder() must return an object */ $this->paymentEventDispatcher->notifyPaymentOrderLoad($this->paymentBridge, $paymentMethod); /** * Order Not found Exception must be thrown just here. */ if (!$this->paymentBridge->getOrder()) { throw new PaymentOrderNotFoundException(); } /** * Order exists right here. */ $this->paymentEventDispatcher->notifyPaymentOrderCreated($this->paymentBridge, $paymentMethod); /** * Validate the order in the module * params for stripe interaction. */ $cardParams = ['number' => $paymentMethod->getCreditCardNumber(), 'exp_month' => $paymentMethod->getCreditCardExpirationMonth(), 'exp_year' => $paymentMethod->getCreditCardExpirationYear()]; return ['card' => $cardParams, 'amount' => $cartAmount, 'currency' => strtolower($this->paymentBridge->getCurrency())]; }
/** * Generate token to make the payment request * * @return string */ public function generateToken() { $extraData = $this->paymentBridge->getExtraData(); $cartAmount = (double) number_format($this->paymentBridge->getAmount() / 100, 2, '.', ''); $payload = new Payload(); $payload->setIssuedAt(time()); $payload->setExpiration(time() + 3600); $payload->addProperty("name", $extraData['order_name']); $payload->addProperty("description", $extraData['order_description']); $payload->addProperty("price", $cartAmount); $payload->addProperty("currencyCode", $this->paymentBridge->getCurrency()); $token = $payload->CreatePayload($this->merchantId); $jwtToken = JWTHelper::encode($token, $this->secretKey); $paymentMethod = new GoogleWalletMethod(); $paymentMethod->setApiToken($jwtToken); $this->paymentEventDispatcher->notifyPaymentOrderLoad($this->paymentBridge, $paymentMethod); return $jwtToken; }
/** * Tries to process a payment through Pagosonline * * @param PagosonlineMethod $paymentMethod Payment method * @param float $amount Amount * * @return PagosonlineManager Self object * * @throws PaymentAmountsNotMatchException * @throws PaymentOrderNotFoundException * @throws PaymentException */ public function processPayment(PagosonlineMethod $paymentMethod, $amount) { /// first check that amounts are the same $paymentBridgeAmount = (double) $this->paymentBridge->getAmount(); /** * If both amounts are different, execute Exception */ if (abs($amount - $paymentBridgeAmount) > 1.0E-5) { throw new PaymentAmountsNotMatchException(); } /** * At this point, order must be created given a cart, and placed in PaymentBridge * * So, $this->paymentBridge->getOrder() must return an object */ $this->paymentEventDispatcher->notifyPaymentOrderLoad($this->paymentBridge, $paymentMethod); /** * Order Not found Exception must be thrown just here */ if (!$this->paymentBridge->getOrder()) { throw new PaymentOrderNotFoundException(); } $this->paymentEventDispatcher->notifyPaymentOrderCreated($this->paymentBridge, $paymentMethod); $extraData = $this->paymentBridge->getExtraData(); $object_ws = new \stdClass(); $object_ws->cuentaId = $this->accountId; $object_ws->referencia = $this->paymentBridge->getOrderId() . '#' . date('Ymdhis'); $object_ws->descripcion = $this->paymentBridge->getOrderDescription(); $object_ws->valor = $this->paymentBridge->getAmount(); $object_ws->iva = $extraData['vat']; $object_ws->baseDevolucionIva = $extraData['refund_vat']; $object_ws->isoMoneda4217 = $this->paymentBridge->getCurrency(); $object_ws->numeroCuotas = $paymentMethod->getCardQuota(); $object_ws->nombreComprador = $extraData['customer_firstname'] . $extraData['customer_lastname']; $object_ws->emailComprador = $extraData['customer_email']; $object_ws->franquicia = $paymentMethod->getCardType(); $object_ws->numero = $paymentMethod->getCardNum(); $object_ws->codigoSeguridad = $paymentMethod->getCardSecurity(); $object_ws->nombreTarjetaHabiente = $paymentMethod->getCardName(); $object_ws->fechaExpiracion = $paymentMethod->getCardExpYear() . '/' . $paymentMethod->getCardExpMonth(); $object_ws->validarModuloAntiFraude = true; $object_ws->reportarPaginaConfirmacion = false; //Antifraude $object_ws->ciudadCorrespondencia = $extraData['correspondence_city']; $object_ws->cookie = $paymentMethod->getCookie(); $object_ws->direccionCorrespondencia = $extraData['correspondence_address']; $object_ws->ipComprador = $paymentMethod->getClientIp(); $object_ws->paisCorrespondencia = 'CO'; $object_ws->userAgent = $paymentMethod->getUserAgent(); $autWS = $this->pagosonlineComm->solicitarAutorizacion($object_ws); $this->logger->addInfo($paymentMethod->getPaymentName(), get_object_vars($object_ws)); $paymentMethod->setPagosonlineTransactionId($autWS->transaccionId); $paymentMethod->setPagosonlineReference($autWS->referencia); $this->processTransaction($autWS, $paymentMethod); return $this; }
/** * Tries to process a payment through Banwire * * @param BanwireMethod $paymentMethod Payment method * @param float $amount Amount * * @return BanwireManager Self object * * @throws PaymentAmountsNotMatchException * @throws PaymentOrderNotFoundException * @throws PaymentException */ public function processPayment(BanwireMethod $paymentMethod, $amount) { /** * first check that amounts are the same */ $paymentBridgeAmount = intval($this->paymentBridge->getAmount()); /** * If both amounts are different, execute Exception */ if ($amount != $paymentBridgeAmount) { throw new PaymentAmountsNotMatchException(sprintf('Amounts differ. Requested: [%s] but in PaymentBridge: [%s].', $amount, $paymentBridgeAmount)); } /** * At this point, order must be created given a cart, and placed in PaymentBridge * * So, $this->paymentBridge->getOrder() must return an object */ $this->paymentEventDispatcher->notifyPaymentOrderLoad($this->paymentBridge, $paymentMethod); /** * Order Not found Exception must be thrown just here */ if (!$this->paymentBridge->getOrder()) { throw new PaymentOrderNotFoundException(); } $this->paymentEventDispatcher->notifyPaymentOrderCreated($this->paymentBridge, $paymentMethod); $extraData = $this->paymentBridge->getExtraData(); $carExp = substr($paymentMethod->getCardExpYear(), -2); $params = array('response_format' => 'JSON', 'user' => $this->user, 'reference' => $this->paymentBridge->getOrderId() . '#' . date('Ymdhis'), 'currency' => $this->paymentBridge->getCurrency(), 'ammount' => number_format($this->paymentBridge->getAmount() / 100, 2), 'concept' => $this->paymentBridge->getOrderDescription(), 'card_num' => $paymentMethod->getCardNum(), 'card_name' => $paymentMethod->getCardName(), 'card_type' => $paymentMethod->getCardType(), 'card_exp' => $paymentMethod->getCardExpMonth() . '/' . $carExp, 'card_ccv2' => $paymentMethod->getCardSecurity(), 'address' => $extraData['correspondence_address'], 'post_code' => $extraData['customer_postal_code'], 'phone' => $extraData['customer_phone'], 'mail' => $extraData['customer_email']); $host = $this->api; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $host); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; WINDOWS; .NET CLR 1.1.4322)'); curl_setopt($ch, CURLOPT_MAXREDIRS, 10); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); if (defined('CURLOPT_ENCODING')) { curl_setopt($ch, CURLOPT_ENCODING, ""); } $responseApi = curl_exec($ch); $this->processTransaction($responseApi, $paymentMethod); return $this; }
/** * Tries to process a payment through Paymill * * @param PaymillMethod $paymentMethod Payment method * @param integer $amount Amount * * @return PaymillManager Self object * * @throws PaymentAmountsNotMatchException * @throws PaymentOrderNotFoundException * @throws PaymentException */ public function processPayment(PaymillMethod $paymentMethod, $amount) { /// first check that amounts are the same $paymentBridgeAmount = intval($this->paymentBridge->getAmount()); /** * If both amounts are different, execute Exception */ if ($amount != $paymentBridgeAmount) { throw new PaymentAmountsNotMatchException(sprintf('Amounts differ. Requested: [%s] but in PaymentBridge: [%s].', $amount, $paymentBridgeAmount)); } /** * At this point, order must be created given a card, and placed in PaymentBridge * * So, $this->paymentBridge->getOrder() must return an object */ $this->paymentEventDispatcher->notifyPaymentOrderLoad($this->paymentBridge, $paymentMethod); /** * Order Not found Exception must be thrown just here */ if (!$this->paymentBridge->getOrder()) { throw new PaymentOrderNotFoundException(); } /** * Order exists right here */ $this->paymentEventDispatcher->notifyPaymentOrderCreated($this->paymentBridge, $paymentMethod); /** * Validate the order in the module * params for paymill interaction */ $extraData = $this->paymentBridge->getExtraData(); $params = array('amount' => $paymentBridgeAmount, 'currency' => $this->paymentBridge->getCurrency(), 'token' => $paymentMethod->getApiToken(), 'description' => $extraData['order_description']); try { $transaction = $this->paymillTransactionWrapper->create($params['amount'], $params['currency'], $params['token'], $params['description']); } catch (PaymillException $e) { /** * create 'failed' transaction */ $transaction = new Transaction(); $transaction->setStatus('failed'); $transaction->setDescription($e->getCode() . ' ' . $e->getMessage()); } $this->processTransaction($transaction, $paymentMethod); return $this; }
/** * Check if transaction is complete. * * When we receive an IPN response, we should * check that the price paid corresponds to the * amount stored in the PaymentMethod. This double * check is essential since the web checkout form * could be mangled. * * @link https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNIntro/ * * @param array $ipnParameters Paypal IPN parameters * * @return bool */ private function transactionSuccessful($ipnParameters) { /** * First of all we have to check the validity of the IPN * message. We need to send back the contents of the query * string coming from Paypal's IPN message. */ $ipnNotifyValidateUrl = $this->urlFactory->getApiEndpoint() . '?' . http_build_query(array_merge($this->urlFactory->getPaypalNotifyValidateQueryParam(), $ipnParameters)); $ipnValidated = file_get_contents($ipnNotifyValidateUrl) == 'VERIFIED'; /** * Matching paid amount with the originating order amount, * this is a security check to prevent frauds by manually * changing the papal form. */ $amountMatches = $this->paymentBridge->getAmount() / 100 == $ipnParameters['mc_gross']; $amountMatches = $amountMatches && $this->paymentBridge->getCurrency() == $ipnParameters['mc_currency']; /** * When a transaction is successful, payment_status has a 'Completed' value. */ return $amountMatches && $ipnValidated && strcmp($ipnParameters['payment_status'], 'Completed') === 0; }
/** * Tries to process a payment through DineromailApi * * @param DineromailApiMethod $paymentMethod Payment method * @param float $amount Amount * @param env * * @throws PaymentAmountsNotMatchException * @throws PaymentOrderNotFoundException * @return DineromailAPiManager Self object */ public function processPayment(DineromailApiMethod $paymentMethod, $amount) { /// first check that amounts are the same $paymentBridgeAmount = (double) $this->paymentBridge->getAmount(); /** * If both amounts are different, execute Exception */ if (abs($amount - $paymentBridgeAmount) > 1.0E-5) { throw new PaymentAmountsNotMatchException(); } /** * At this point, order must be created given a cart, and placed in PaymentBridge * * So, $this->paymentBridge->getOrder() must return an object */ $this->paymentEventDispatcher->notifyPaymentOrderLoad($this->paymentBridge, $paymentMethod); /** * Order Not found Exception must be thrown just here */ if (!$this->paymentBridge->getOrder()) { throw new PaymentOrderNotFoundException(); } $this->paymentEventDispatcher->notifyPaymentOrderCreated($this->paymentBridge, $paymentMethod); $extraData = $this->paymentBridge->getExtraData(); //params to send dineromailapi api $cardYear = substr($paymentMethod->getCardExpYear(), -2); $cardExp = str_pad($paymentMethod->getCardExpMonth(), 2, '0', STR_PAD_LEFT) . '/' . $cardYear; $items = array(); foreach ($extraData['dinero_mail_api_items'] as $key => $dineroMailApiItem) { $items[] = array('Amount' => $dineroMailApiItem['amount'], 'Currency' => $this->paymentBridge->getCurrency(), 'Code' => '', 'Description' => '', 'Name' => $dineroMailApiItem['name'], 'Quantity' => $dineroMailApiItem['quantity']); } $buyer = array('Name' => $extraData['customer_firstname'], 'LastName' => $extraData['customer_lastname'], 'Email' => $extraData['customer_email'], 'Address' => $extraData['correspondence_address'], 'Phone' => $extraData['customer_phone'], 'Country' => $extraData['customer_country'], 'City' => $extraData['correspondence_city']); $creditCard = array('Installment' => $paymentMethod->getCardQuota(), 'CreditCardNumber' => $paymentMethod->getCardNum(), 'Holder' => $paymentMethod->getCardName(), 'ExpirationDate' => $cardExp, 'SecurityCode' => $paymentMethod->getCardSecurity(), 'DocumentNumber' => '1234567', 'Address' => '', 'AddressNumber' => '', 'AddressComplement' => '', 'ZipCode' => '', 'Neighborhood' => '', 'City' => '', 'State' => '', 'Country' => ''); $result = $this->processSoap($items, $buyer, $creditCard, $paymentMethod->getCardType()); $this->processTransaction($result, $paymentMethod); return $this; }
/** * Return stripe script * * @return string Stripe script */ protected function getStripeScript() { $currency = $this->paymentBridgeInterface->getCurrency(); return $this->templating->render('StripeBundle:Stripe:scripts.html.twig', ['public_key' => $this->publicKey, 'currency' => $currency]); }
/** * Render stripe scripts. * * @param Twig_Environment $environment Environment */ public function renderStripeScripts(Twig_Environment $environment) { $environment->display($this->scriptsTemplate, ['public_key' => $this->publicKey, 'currency' => $this->paymentBridgeInterface->getCurrency()]); }
/** * Render banwire scripts view */ public function renderPaymentScripts() { $this->environment->display('BanwireBundle:Banwire:scripts.html.twig', array('currency' => $this->paymentBridgeInterface->getCurrency())); }
/** * Render stripe scripts view * * @return string js code needed by Stripe behaviour */ public function renderPaymentScripts() { return $this->environment->display($this->scriptsTemplate, array('public_key' => $this->publicKey, 'currency' => $this->paymentBridgeInterface->getCurrency())); }
/** * Buildform function * * @param FormBuilderInterface $builder the formBuilder * @param array $options the options for this form */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder->setAction($this->router->generate($this->controllerRouteName, array(), true))->setMethod('POST')->add('amount', 'hidden', array('data' => $this->paymentBridge->getAmount()))->add('currency', 'hidden', array('data' => $this->paymentBridge->getCurrency()))->add('paypal_express_params', 'hidden', array('data' => $options['paypal_express_params']))->add('submit', 'submit'); }